【问题标题】:Pandas Merge DataFrames without rows overlap熊猫合并没有行重叠的数据帧
【发布时间】:2017-06-02 08:55:38
【问题描述】:

我有两个这样的数据框:

它们具有相同的列。

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

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

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

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

但结果分别是:

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

【问题讨论】:

  • 那么当tradeID 出现在两个数据帧中时,您希望在合并结果中出现什么?
  • @IgorRaush,两行完全相同,我想只保留其中一个,还请注意tradeID 是一个索引
  • 代码:df2 = df0.merge(df1, how='outer') 有效,但它会丢弃我的索引

标签: python pandas


【解决方案1】:

似乎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() 在这个非常小的数据集上始终以近 3 倍的速度击败merge

...Igor Raush 的版本测试速度比combine_first() 稍快。

【讨论】:

  • 太棒了!它就像我需要的那样工作!非常感谢!
  • 很高兴我能帮上忙
【解决方案2】:

实现此目的的一种方法是

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

【讨论】:

    猜你喜欢
    • 2019-07-20
    • 2018-11-16
    • 2018-02-11
    • 2014-12-04
    • 2021-09-13
    • 2021-06-22
    • 1970-01-01
    • 2016-11-09
    • 2019-12-07
    相关资源
    最近更新 更多