2017-05-13 3 views
0

문제점을 해결하기 위해 노력했지만 짧게 나타났습니다. 그것이 다른 곳에 있다면 알려주십시오.팬더를 사용하여 다른 두 열의 값을 기준으로 열의 값을 바꿉니다.

I는 다음과 같이 4 개의 열이있는 dataframe있다 :

'A' 'B' 'C'  'D' 

cheese 5  grapes 7 
grapes 7  cheese 8 
steak 1  eggs  21 
eggs 2  steak  1 

'A'및 'B'의 값과 일치해야 'C'와 'D'의 항목 아니라 로우 단계; 예를 들어, "B"에 "치즈"가 "5"이면 "치즈"에는 'D'에 "8"을 넣을 수 없습니다. 불일치가있는 경우 'C'및 'D'값을 기본값으로 수정해야합니다. 이 경우 C : default 및 D : 0이되도록 "cheese"를 수정해야합니다. 계란과 포도와 동일합니다. 스테이크는 괜찮습니다. 'D'값 기반

'A' 'B' 'C'  'D' 
cheese 5 grapes 7 
grapes 7 default 0 
steak 1 default 0 
eggs 2 steak 1 

내가 고유 한 값으로 목록에 'A'와 'B'를 변환하기 위해 노력하고 'C'를 대체하기 위해 노력하고 :

그래서 출력은 다음과 같아야합니다 목록에. stackoverflow에서 찾을 수있는 조건부 df.replace() 트릭을 모두 시도했지만 아무 것도 생각 나지 않았습니다.

제공하신 도움에 감사드립니다. 그것은``C`가 steak` 두 행이 가능한 열

+0

입니까? 그렇다면 코드의 동작은 무엇입니까? –

+0

@ ViníciusAguiar : 네, 열'C'는 여러 항목을 가질 수 있습니다. 포도, 스테이크, 달걀 등은 모두 여러 번 'C'로 여러 번 나타날 수 있으며 잠재적으로 여러 개의 'D'값으로 나타납니다. 데이터가 예기치 않게 더럽습니다. 'A \ B' 쌍은 고유합니다. 코드는'A \ B' 쌍과 일치하지 않는 모든'C/D' 쌍을 찾아서'\ default'로 수정해야합니다. – crimins

답변

0

설치

df = pd.DataFrame({'A': {0: 'cheese', 1: 'grapes', 2: 'steak', 3: 'eggs'}, 
'B': {0: 5, 1: 7, 2: 1, 3: 2}, 
'C': {0: 'grapes', 1: 'default', 2: 'default', 3: 'steak'}, 
'D': {0: 7, 1: 0, 2: 0, 3: 1}}) 

df 
Out[1262]: 
     A B  C D 
0 cheese 5 grapes 7 
1 grapes 7 default 0 
2 steak 1 default 0 
3 eggs 2 steak 1 

해결

#find rows where df.C should be set to default. 
df.C = df.apply(lambda x: x.C if ((x.C not in df.A.tolist()) or (x.D==df.loc[df.A==x.C, 'B'].iloc[0])) else 'default', axis=1) 
#set df.D to 0 for df.C == default 
df.loc[df.C=='default','D']=0 

df 
Out[1259]: 
     A B  C D 
0 cheese 5 grapes 7 
1 grapes 7 default 0 
2 steak 1 default 0 
3 eggs 2 steak 1 
관련 문제