我有两个这样的数据框:
他们有相同的列。
由于我正在广播一个API,它们通常会有一些重叠,这可以由唯一的tradeID
来处理。
我尝试了一些类似的东西:
df2 = df0.join(df1, how='outer', lsuffix='_caller', rsuffix='_other')
和
df2 = df0.merge(df1, left_index=True, right_index=True)
但结果分别是:
我正在寻找没有重叠的工会,有人可以帮助我吗?
答案 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()]