2017-11-28 25 views
0

"A"로 구분 된 값을 포함하는 목록 A가 있습니다. 이목록의 부분 값을 찾아서 바꿉니다.

df1['original']= ['aaa|bbb|ccc','aaa|ccc','aaa|ccc|ddd'] 

출력과 같습니다 다른 안양에서

aaa|bbb|ccc 
aaa|ccc 
aaa|ccc|ddd 

, 내가 다른 두 개의 열이 있습니다. 첫 번째는 다음과 같습니다 : df1['title']=['aaa','bbb','ccc','ddd']. 그리고 그에 따라 df1 [ 'title'] 옆에 다른 열이 있습니다. df1['new_value']=['x','y','z','w'].

출력 :

title new_value 
aaa  x 
bbb  y 
ccc  z 
ddd  w 

내가 df1['original']의 모든 값을 검색하고 df1['title']df1['new_value']에 따라 검색 결과로 대체합니다. 원래 열에 |을 보관하고 싶습니다. 그리고 최종 출력은, 다음과 같이

df1['New']=['x|y|z','x|z','x|z|w'] 

출력 : 새로운

x|y|z 
x|z 
x|z|w 

이 파이썬에서 이것을 달성하는 방법을 엑셀과 아이디어의 조건 조회와 같은 더?

시간 내 주셔서 감사합니다.

아래 링크는 하나의 값을 포함하는 링크와 만 일치 할 수 있습니다. 목록의 값 검색 및 바꾸기 (팬더)

답변

0

replace

df1['New']=df1.original.replace(df2.set_index('title').new_value.to_dict(),regex=True) 
df1 
Out[758]: 
     original New 
0 aaa|bbb|ccc x|y|z 
1  aaa|ccc x|z 
2 aaa|ccc|ddd x|z|w 
+0

이 경우'df2' 란 무엇입니까? – dawg

+0

@ dawg * 다른 df *에서는 op의 입력이라고 생각합니다. 맞습니까? – Wen

+0

글쎄 그것은 유망 해 보이지만 주어진 예제는'df1'의 모든 칼럼이다 ... 그러나 그의 예는 너무 틀릴 수도있다 ;-) – dawg

0

format 방법을 사용하는이 악의적 인 해킹은 어떻습니까?

In = ['aaa|bbb|ccc','aaa|ccc','aaa|ccc|ddd'] 
replace = 'aaa x bbb y ccc z ddd w' 
# use the infamous grouper (if you have keys and values in separate 
# lists you don't need this) to get a dict: 
replace = iter(replace.split()) 
replace = dict(zip(*2*(replace,))) 
# enclose all templates with curlies 
# like 'aaa|bbb|ccc' -> '{aaa}|{bbb}|{ccc}' 
# and use .format 
Out = [('{' + s.replace('|', '}|{') + '}').format(**replace) for s in In] 
# ['x|y|z', 'x|z', 'x|z|w'] 
+0

안녕 폴, 답장을 보내 주셔서 감사를 사용하여 우리를 보자. 루프까지 확장 할 수 있습니까? Coz는 실제로 큰 데이터 세트를 가지고 있으며 이것은 단지 작은 예일뿐입니다. 나는 Python을 처음 사용한다. –

+0

목록에 모든 입력 사항이 있으면 명시 적 반복이 필요하지 않습니다. 출력은 소위 말하는 [list comprehension] (https://en.wikipedia.org/wiki/List_comprehension)에 의해 만들어집니다. 'In'에 대한 거대한 목록을보십시오. 코드는 변경없이 작동해야합니다. –

0

파이썬에서 유일한, 질서, 당신은 할 수 있습니다 :

df1={} 
df1['original']= ['aaa|bbb|ccc','aaa|ccc','aaa|ccc|ddd'] 
df1['title']=['aaa','bbb','ccc','ddd'] 
df1['new_value']=['x','y','z','w'] 

매핑 이전의 딕셔너리를 만듭니다

의 (a 팬더 데이터 프레임에 정말 비슷합니다)를 DICT 만들기 새로운에 :

di=dict(zip(df1['title'], df1['new_value'])) 

새로운 DICT 항목 설명 만들기 :

nl=[] 
for sl in [s.split('|') for s in df1['original']]: 
    nl.append([di[e] for e in sl]) 

df1['New']=['|'.join(e) for e in nl] 
# {'New': ['x|y|z', 'x|z', 'x|z|w'],...} 
+0

안녕하세요, 당신이 사전을 만들 때,이 경우에는 모든 입력을 수동으로 입력 할 수 있지만 실제로는 매우 큰 데이터 세트가 있습니다. 어떻게 그 경우에 사전을 작성해야합니까? 어떤 제안이라도? –

+0

데이터 프레임의 열을 사용하기 만하면됩니다. 내 설명서의 항목은 거의 동일하게 작동해야합니다. – dawg