在pandas中加入或合并覆盖

sar*_*ele 33 python pandas

我想在具有日期时间索引的数据帧上执行连接/合并/追加操作.

让我们说我有df1,我想加入df2它. df2可以有更少或更多的列,以及重叠的索引.对于索引匹配的所有行,如果df2列具有相同的列df1,我希望df1用来自的列覆盖这些值df2.

如何获得所需的结果?

Wes*_*ney 36

怎么样: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
Run Code Online (Sandbox Code Playgroud)

请注意,它采用df1不重叠的索引的值df2.如果这不完全符合您的要求,我愿意改进此功能/添加选项.

  • 我认为如果这个功能是`df.update`函数的一部分,并且可选参数'join ='outer'`(目前只实现了`left`),那将会更加直观.在我的例子中,`df2`(从'df1`计算)的列比`df1`少得多(但有些不在`df1`中),我想用可能的计算值更新`df1`加上额外的列.为此,我认为`df1.update(df2,join ='outer')`比`df1 = df2.combine_first(df1)`更容易理解.PS.这是一个小小的狡辩,但其他"熊猫"几乎完全是真棒!=) (2认同)

Nic*_*ica 17

对于像这样的合并,updateDataFrame 的方法很有用.

文档中的示例为例:

import pandas as pd
import numpy as np

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

之前的数据update:

>>> df1
     0    1    2
0  NaN  3.0  5.0
1 -4.6  2.1  NaN
2  NaN  7.0  NaN
>>>
>>> df2
      0    1    2
1 -42.6  NaN -8.2
2  -5.0  1.6  4.0
Run Code Online (Sandbox Code Playgroud)

让我们df1用以下数据更新df2:

df1.update(df2)
Run Code Online (Sandbox Code Playgroud)

更新后的数据:

>>> df1
      0    1    2
0   NaN  3.0  5.0
1 -42.6  2.1 -8.2
2  -5.0  1.6  4.0
Run Code Online (Sandbox Code Playgroud)

备注:

  • 重要的是要注意这是一个"就地"操作,修改调用的DataFrame update.

  • 这比`combine_first`更直观,因为它完全像我们从dicts中知道的`update`方法. (6认同)
  • 仅当您愿意排除 df2 特有的索引时,才应该使用“update” 如果您想包含它们,请使用“combine_first” (4认同)
  • 请注意,DataFrame.update() 与 dict 有点不同,因为它不会像 dict 添加新键那样添加新索引项。示例:https://gist.github.com/folutefreak7/b4eb6a93565c375d79b791c2bbd672b1 (2认同)