【问题标题】:Pandas: Join or merge multiple dataframes on a column where column values are repeatingPandas:在列值重复的列上加入或合并多个数据框
【发布时间】:2019-07-31 02:00:37
【问题描述】:

我有三个数据帧,行数超过 71K。以下是样本。

df_1 = pd.DataFrame({'Device_ID':[1001,1034,1223,1001],'Col_A':[45,56,78,33]})
df_2 = pd.DataFrame({'Device_ID':[1001,1034,1223,1001,1887],'Col_B':[35,46,78,33,66]})
df_3 = pd.DataFrame({'Device_ID':[1001,1034,1223,1001,1887,1223],'Col_C':[5,14,8,13,16,8]})

编辑 如建议的那样,以下是我想要的输出

df_final
Device_ID      Col_A    Col_B     Col_C
1001           45       35         5
1034           56       46         14
1223           78       78         8
1001           33       33         13
1887           Nan      66         16
1223           NaN      NaN        8

使用pd.merge()df_1.set_index('Device_ID').join([df_2.set_index('Device_ID'),df_3.set_index('Device_ID')],on='Device_ID') 时会花费很长时间。一个原因是重复 Device_ID 的值。

我知道reduce 方法,但我怀疑它可能会导致同样的情况。

有没有更好更有效的方法?

【问题讨论】:

  • 密钥的重复程度如何?您可能会生成一个带有重叠键的三重合并的大型 DataFrame,如果不是更多的话,可能会生成数万亿行。
  • 那你有什么建议?我应该使用groupby 然后merge
  • 请提供您尝试实现的输出示例。您想如何处理这些重复值?

标签: python pandas


【解决方案1】:

为了得到你想要的结果,你可以使用这个:

result = pd.concat([df_1.drop('Device_ID', axis=1),df_2.drop('Device_ID',axis=1),df_3],axis=1).set_index('Device_ID')

如果您不想使用Device_ID 作为索引,可以删除代码中的set_index 部分。另外,请注意,由于最终数据帧中的某些列(Col_A 和 Col_B)中存在 NaN,Pandas 会将非缺失值转换为浮点数,因为 NaN 不能存储在整数数组中(除非您有 Pandas 版本0.24,在这种情况下你可以阅读更多关于它的信息here)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 2020-11-13
    相关资源
    最近更新 更多