2017-05-12 3 views
3

한 쌍의 조건 (monthnum)의 첫 번째 항목을 기반으로 한 작은 데이터 프레임과 하나의 큰 데이터 프레임을 병합하려고합니다.팬더 : 다중 레벨 첫 번째 어커런스를 기반으로 데이터 프레임 병합

실용적인 코드 (실제/원하는 출력이 아래쪽에 표시됨)를 함께 자필했지만, 훨씬 더 효율적으로 보일 수 있습니다.

내 질문은 -이 작업을 수행하는 데 훨씬 쉬운 방법이 없습니까?

설정 :

import pandas as pd 

m = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2] 
n = [1,1,1,20,20,300,300,20,20,1,1,1,20,300,20,1,1,1,20,20,300,300,300,20,20,1,1] 
df = pd.DataFrame({'month':m, 'num':n, 'x':0}) 

m2 = [1,1,1,2,2,2] 
n2 = [1,20,300,1,20,300] 
s2 = [11,222,3333,44,555,6666] 
df2 = pd.DataFrame({'month':m2, 'num':n2, 'sum':s2}) 

현재 코드 :

dfx = pd.DataFrame(df.groupby(['month','num'])['x'].idxmax()) 
dfx.rename(columns = {'x':'find'}, inplace = True) 

df2.set_index(['month','num'], inplace = True) 
df2 = pd.merge(df2, dfx, left_index = True, right_index = True) 

df = df.merge(df2, left_index = True, right_on = 'find', how = 'left') 
df = df.drop(['find','x'], axis = 1).reset_index(drop = True).fillna(0) 

출력 :

month num  sum 
0  1 1 11.0 
1  1 1  0.0 
2  1 1  0.0 
3  1 20 222.0 
4  1 20  0.0 
5  1 300 3333.0 
6  1 300  0.0 
7  1 20  0.0 
8  1 20  0.0 
9  1 1  0.0 
10  1 1  0.0 
11  1 1  0.0 
12  1 20  0.0 
13  1 300  0.0 
14  1 20  0.0 
15  1 1  0.0 
16  2 1 44.0 
17  2 1  0.0 
18  2 20 555.0 
19  2 20  0.0 
20  2 300 6666.0 
21  2 300  0.0 
22  2 300  0.0 
23  2 20  0.0 
24  2 20  0.0 
25  2 1  0.0 
26  2 1  0.0 

답변

5

내가 제대로 이해한다면, 당신은 캘리포니아 N 비 첫번째 발행 수를 제로로 한 후, 당신이 DataFrames 사이에 일반 mergelocduplicated을 결합 :

df3 = df.merge(df2, how='left', on=['month', 'num']) 
df3.loc[df3.duplicated(subset=['month', 'num']), 'sum'] = 0 

결과 출력 :

month num sum 
0  1 1 11 
1  1 1  0 
2  1 1  0 
3  1 20 222 
4  1 20  0 
5  1 300 3333 
6  1 300  0 
7  1 20  0 
8  1 20  0 
9  1 1  0 
10  1 1  0 
11  1 1  0 
12  1 20  0 
13  1 300  0 
14  1 20  0 
15  1 1  0 
16  2 1 44 
17  2 1  0 
18  2 20 555 
19  2 20  0 
20  2 300 6666 
21  2 300  0 
22  2 300  0 
23  2 20  0 
24  2 20  0 
25  2 1  0 
26  2 1  0 
+0

아주 좋은을! 이제 이동할 수 있습니다 :-) – piRSquared

+0

아. 왜냐하면 .duplicated는 기본적으로 첫 번째 발생을 유지하기 때문입니다. 기발한 천재. 고맙습니다! – pshep123

관련 문제