3
한 쌍의 조건 (month
및 num
)의 첫 번째 항목을 기반으로 한 작은 데이터 프레임과 하나의 큰 데이터 프레임을 병합하려고합니다.팬더 : 다중 레벨 첫 번째 어커런스를 기반으로 데이터 프레임 병합
실용적인 코드 (실제/원하는 출력이 아래쪽에 표시됨)를 함께 자필했지만, 훨씬 더 효율적으로 보일 수 있습니다.
내 질문은 -이 작업을 수행하는 데 훨씬 쉬운 방법이 없습니까?
설정 :
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
아주 좋은을! 이제 이동할 수 있습니다 :-) – piRSquared
아. 왜냐하면 .duplicated는 기본적으로 첫 번째 발생을 유지하기 때문입니다. 기발한 천재. 고맙습니다! – pshep123