Pandas Merge DataFrames没有行重叠

时间:2017-06-01 23:23:03

标签: python pandas

我有两个这样的数据框:

enter image description here

enter image description here

他们有相同的列。

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

我尝试了一些类似的东西:

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

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

但结果分别是:

enter image description here

enter image description here

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

2 个答案:

答案 0 :(得分:3)

似乎combine_first()应该为你做这件事:

df2 = df0.combine_first(df1)

...当指标匹配时,df0优先于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)

<强>输出:

         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

如果你真的想使用merge,你仍然可以这样做,但是你需要添加一些语法来保持你的指标(more info):

df = dfA.reset_index().merge(dfB.reset_index(), how = 'outer').set_index('tradeID')

我在这两个选项上运行了超级基本时间,并且combine_first()在这个非常小的数据集上一直超过merge近3倍。

......和Igor Raush的版本测试时间比combine_first()或稍快一点。

答案 1 :(得分:1)

实现这一目标的一种方法是

pd.concat([df0, df1]).loc[lambda df: ~df.index.duplicated()]