2012-03-20 4 views
20

datetime 인덱스가있는 데이터 프레임에 조인/병합/추가 작업을 수행하려고합니다.팬 아트에서 덮어 쓰기로 결합 또는 병합

내가 df1을 가지고 있고 그것에 df2을 추가하려고한다고 가정 해 봅시다. df2은 더 적은 수 이상의 열과 겹치는 인덱스를 가질 수 있습니다. 인덱스가 일치하는 모든 행에 대해 과 동일한 열을 가진 df2 인 경우 df1의 값을 df2의 값으로 덮어 쓰려고합니다.

원하는 결과를 얻으려면 어떻게해야합니까?

답변

22

어웨이 : df2.combine_first(df1)? 이 df2 중첩되지 않는 인덱스위한 df1의 값을 취한다는

In [33]: df2 
Out[33]: 
        A   B   C   D 
2000-01-03 0.638998 1.277361 0.193649 0.345063 
2000-01-04 -0.816756 -1.711666 -1.155077 -0.678726 
2000-01-05 0.435507 -0.025162 -1.112890 0.324111 
2000-01-06 -0.210756 -1.027164 0.036664 0.884715 
2000-01-07 -0.821631 -0.700394 -0.706505 1.193341 
2000-01-10 1.015447 -0.909930 0.027548 0.258471 
2000-01-11 -0.497239 -0.979071 -0.461560 0.447598 

In [34]: df1 
Out[34]: 
        A   B   C 
2000-01-03 2.288863 0.188175 -0.040928 
2000-01-04 0.159107 -0.666861 -0.551628 
2000-01-05 -0.356838 -0.231036 -1.211446 
2000-01-06 -0.866475 1.113018 -0.001483 
2000-01-07 0.303269 0.021034 0.471715 
2000-01-10 1.149815 0.686696 -1.230991 
2000-01-11 -1.296118 -0.172950 -0.603887 
2000-01-12 -1.034574 -0.523238 0.626968 
2000-01-13 -0.193280 1.857499 -0.046383 
2000-01-14 -1.043492 -0.820525 0.868685 

In [35]: df2.comb 
df2.combine  df2.combineAdd  df2.combine_first df2.combineMult  

In [35]: df2.combine_first(df1) 
Out[35]: 
        A   B   C   D 
2000-01-03 0.638998 1.277361 0.193649 0.345063 
2000-01-04 -0.816756 -1.711666 -1.155077 -0.678726 
2000-01-05 0.435507 -0.025162 -1.112890 0.324111 
2000-01-06 -0.210756 -1.027164 0.036664 0.884715 
2000-01-07 -0.821631 -0.700394 -0.706505 1.193341 
2000-01-10 1.015447 -0.909930 0.027548 0.258471 
2000-01-11 -0.497239 -0.979071 -0.461560 0.447598 
2000-01-12 -1.034574 -0.523238 0.626968  NaN 
2000-01-13 -0.193280 1.857499 -0.046383  NaN 
2000-01-14 -1.043492 -0.820525 0.868685  NaN 

참고. 이게 정확히 당신이 원하는 기능을 수행하지 않으면이 기능을 향상 시키거나 옵션을 추가 할 의향이 있습니다.

+0

나는 이것이 정말로 내가 원하는 것, 감사합니다. – saroele

+0

'combine_first'에는 몇 가지 30k 행의 세 가지 데이터 프레임을 결합하여 각 메모리를 추월하는 데 문제가 있습니다. 이 주변의 어떤 방법? – scry

+0

이 기능이 선택적 인수'join = 'outer'' (현재는'left' 만 구현 됨)가있는'df.update'-function의 일부인 경우 훨씬 더 직관적이라고 생각합니다. 필자의 경우'df1'에서 계산 한'df2'는'df1'보다 훨씬 적은 수의 열을 가지고 있습니다 (그러나'df1'에없는 열). 가능한 경우 계산 된 값으로'df1'을 업데이트하고 싶습니다 플러스 추가 열. 이를 위해,'df1.update (df2, join = 'outer')'는'df1 = df2.combine_first (df1)'보다 훨씬 이해하기 쉽다고 생각합니다. PS. 이것은 사소한 일이지만, 그렇지 않으면'팬더'는 거의 독점적으로 굉장합니다! =) – Axel

6

이와 같이 병합하려면 DataFrame의 update 메서드가 유용합니다.

documentation에서 예제를 촬영 :

import pandas as pd 
import numpy as np 

df1 = pd.DataFrame([[np.nan, 3., 5.], [-4.6, np.nan, np.nan], 
        [np.nan, 7., np.nan]]) 
df2 = pd.DataFrame([[-42.6, np.nan, -8.2], [-5., 1.6, 4]], 
        index=[1, 2]) 

데이터 update 전과 :

>>> df1 
    0 1 2 
0 NaN 3.0 5.0 
1 -4.6 NaN NaN 
2 NaN 7.0 NaN 
>>> 
>>> df2 
     0 1 2 
1 -42.6 NaN -8.2 
2 -5.0 1.6 4.0 

하자 갱신 df1를 데이터 df2에서 :

df1.update(df2) 

업데이트 후 데이터 :

>>> df1 
     0 1 2 
0 NaN 3.0 5.0 
1 -42.6 NaN -8.2 
2 -5.0 1.6 4.0 

비고 :

  • 그것은이 update를 호출하는 DataFrame을 수정, "대신"작업 것을 알 것이 중요합니다.
+3

이것은'combine_first'보다 직관적입니다. 왜냐하면 우리가 dicts에서 우리가 아는'update' 메소드와 똑같이 작용하기 때문입니다. – saroele

관련 문제