2013-05-16 3 views
7

특정 열 (key1, key2)에 두 개의 데이터 프레임을 병합하고 다른 열 (값)의 값을 합산합니다. SQL의 측면에서팬더에서 두 개의 데이터 프레임을 병합합니다. 일부 열에서 조인하고 다른 테이블을 합산합니다.

key1 key2 value 
0  0  0  0 
1  1  1  1 
2  2  2  12 
3  3  3  14 
4  4  4  12 
5  5  5  13 

가, 내가 원하는 :

방법 1

concatenated = pd.concat([df1, df2]) 
grouped = concatenated.groupby(['key1', 'key2'], as_index=False) 
summed = grouped.agg(np.sum) 
result = summed[['key1', 'key2', 'value']] 
,536,913 :

SELECT df1.key1, df1.key2, df1.value + df2.value AS value 
FROM df1 OUTER JOIN df2 ON key1, key2 

나는 두 가지 방법을 시도

>>> df1 = pd.DataFrame({'key1': range(4), 'key2': range(4), 'value': range(4)}) 
    key1 key2 value 
0  0  0  0 
1  1  1  1 
2  2  2  2 
3  3  3  3 

>>> df2 = pd.DataFrame({'key1': range(2, 6), 'key2': range(2, 6), 'noise': range(2, 6), 'value': range(10, 14)}) 
    key1 key2 noise value 
0  2  2  2  10 
1  3  3  3  11 
2  4  4  4  12 
3  5  5  5  13 

나는이 결과를 원하는 63,210

접근이

joined = pd.merge(df1, df2, how='outer', on=['key1', 'key2'], suffixes=['_1', '_2']) 
joined = joined.fillna(0.0) 
joined['value'] = joined['value_1'] + joined['value_2'] 
result = joined[['key1', 'key2', 'value']] 

두 가지 접근법은 내가 원하는 결과를 제공하지만, 간단한 방법이 있는지 궁금하다.

답변

8

나는 간단 모르는,하지만 당신은 좀 더 간결 얻을 수 있습니다 :

>>> pd.concat([df1, df2]).groupby(["key1", "key2"], as_index=False)["value"].sum() 
    key1 key2 value 
0  0  0  0 
1  1  1  1 
2  2  2  12 
3  3  3  14 
4  4  4  12 
5  5  5  13 

이 작전을 체인에 대한 허용 오차에 따라, 어쨌든 여러 줄에이 휴식 할 수 있습니다,하지만 (사 내 상한에 가까워지는 경향이있다.이 경우 concat-groupby-select-sum).

+0

병합 시간 집계와 같이 좀 더 간결한 방식 인 것처럼 보입니다. –

+0

나는 모든 것을 최적화 된 마법의 기능을 찾고있었습니다. – Laurie

+0

나는 접근 방식 2를 선택했고, 가능한 한 많이 연쇄 작도를 수행했다. 왜냐하면이 방식이 더 빠르기 때문이다. – Laurie

관련 문제