2012-03-20 94 views
20

我想對帶有日期時間索引的數據幀執行連接/合併/附加操作。加入或合併覆蓋熊貓

比方說,我有df1,我想添加df2df2可以包含更少或更多的列以及重疊的索引。對於索引匹配的所有行,如果df2df1具有相同的列,我希望df1的值被來自df2的值覆蓋。

我該如何獲得想要的結果?

回答

22

怎麼樣:df2.combine_first(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 

注意,它需要從df1的值不與df2重疊指數。如果這不完全是你想要的,我會願意改進這個功能/添加選項。

+0

我認爲這確實是我想要的,非常感謝。 – saroele 2012-03-20 22:26:16

+0

'combine_first'存在一個問題 - 使用它來組合三個大約30k行的數據框,每個數據框都超過了我所有的內存。任何方式在這個? – scry 2012-08-06 12:00:35

+0

我認爲如果這個功能是可選參數'join ='outer''(目前只實現'left')的'df.update'函數的一部分,它會更加直觀。 在我的情況下,'df2'(從'df1'計算)的列數比'df1'少(但有些不在'df1'中),我想用可能的值更新'df1'加上額外的列。爲此,我認爲'df1.update(df2,join ='outer')'比'df1 = df2.combine_first(df1)'更容易理解。 PS:這是一個小問題,但否則「熊貓」幾乎完全是真棒! =) – Axel 2017-09-14 13:03:30

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數據幀是很重要的。
+3

這比'combine_first'更直觀,因爲它的行爲與我們從字典中知道的'update'方法完全一樣。 – saroele 2017-04-03 12:06:29