熊猫合并没有行重叠的数据帧

Thi*_*elo 2 python pandas

我有两个这样的数据框:

在此处输入图片说明

在此处输入图片说明

它们具有相同的列。

由于我正在广播一个 API,它们通常有一些重叠,可以由tradeIDwhich 唯一处理。

我试过一些东西,如:

df2 = df0.join(df1, how='outer', lsuffix='_caller', rsuffix='_other')

df2 = df0.merge(df1, left_index=True, right_index=True)

但结果分别是:

在此处输入图片说明

在此处输入图片说明

我正在寻找一个没有重叠的工会,有人可以帮助我吗?

elP*_*tor 5

似乎combine_first()应该为你做:

df2 = df0.combine_first(df1)
Run Code Online (Sandbox Code Playgroud)

... wheredf0优先于df1索引匹配的时间。尽管在您的情况下,如果它们相同,则无关紧要。但如果它们不相同,那就是combine_first()工作原理。

以下是它处理虚拟数据的示例。

代码:

import pandas as pd
import io

a = io.StringIO(u'''
tradeID,amount,date
X001,100,1/1/2016
X002,200,1/2/2016
X003,300,1/3/2016
X005,500,1/5/2016
''')

b = io.StringIO(u'''
tradeID,amount,date
X004,400,1/4/2016
X005,500,1/5/2016
X006,600,1/6/2016
''')

dfA = pd.read_csv(a, index_col = 'tradeID')
dfB = pd.read_csv(b, index_col = 'tradeID')

df = dfA.combine_first(dfB)
Run Code Online (Sandbox Code Playgroud)

输出:

         amount      date
tradeID                  
X001      100.0  1/1/2016
X002      200.0  1/2/2016
X003      300.0  1/3/2016
X004      400.0  1/4/2016
X005      500.0  1/5/2016
X006      600.0  1/6/2016
Run Code Online (Sandbox Code Playgroud)

如果你真的想使用merge你仍然可以这样做,但你需要添加一些语法来保持你的索引(更多信息):

df = dfA.reset_index().merge(dfB.reset_index(), how = 'outer').set_index('tradeID')
Run Code Online (Sandbox Code Playgroud)

我在这两个选项上运行了超级基本的计时,并在这个非常小的数据集上combine_first()始终领先merge近 3 倍。

...和 ​​Igor Raush 的版本在combine_first().