【问题标题】:Combine two dataframes where column values match合并列值匹配的两个数据框
【发布时间】:2021-07-22 05:01:33
【问题描述】:

我有两个包含相似列的数据框:

  ID  prop1
1 UUU &&&
2 III ***
3 OOO )))
4 PPP %%%

  ID  prop2
1 UUU 1234 
2 WWW 4567
3 III 7890
5 EEE 0123
6 OOO 3456
7 RRR 6789
8 PPP 9012

我需要合并这两个 ID 匹配的数据框,并将 prop2 列添加到原始数据框。

  ID  prop1 prop1
1 UUU &&&   1234
2 III ***   7890
3 OOO )))   3456
4 PPP %%%   9012

我尝试了合并、连接、concat、for、iter 等的所有组合。它要么无法合并、丢失索引,要么直接删除列值。

【问题讨论】:

  • 当您在不是索引的级别上合并时,带上索引是无意义的——如果您应该使用哪个索引匹配,来自left 的索引或来自right?理所当然,pandas 只是在结果上加上 Int64Index。如果您需要带上索引,那么您需要在合并之前将其带入列中。

标签: python pandas merge


【解决方案1】:

你可以使用pd.merge():

pd.merge(df1, df2, on='ID')

输出:

    ID prop1  prop2
0  UUU   &&&   1234
1  III   ***   7890
2  OOO   )))   3456
3  PPP   %%%   9012

你也可以使用df.merge()如下::

df1.merge(df2, on='ID')

同样的结果。

.merge()无论使用pd.merge()还是df.merge(),默认参数都是how='inner'。因此,您已经在进行内部连接而没有指定 how= 参数。

更复杂的场景:

如果您需要更复杂的情况来维护df11, 2, 3, 4而不是0, 1, 2, 3的索引,您可以通过在合并之前重置索引然后在重置时产生的临时index列上设置索引来实现索引:

df1.reset_index().merge(df2, on='ID').set_index('index')

输出:

        ID prop1  prop2
index                  
1      UUU   &&&   1234
2      III   ***   7890
3      OOO   )))   3456
4      PPP   %%%   9012

现在,保留原始df1 的索引1 2 3 4

或者,如果您不希望轴标签 index 出现在行索引的顶部,您可以按如下方式执行 rename_axis()

df1.reset_index().merge(df2, on='ID').set_index('index').rename_axis(index=None)

输出:

        ID prop1  prop2
1      UUU   &&&   1234
2      III   ***   7890
3      OOO   )))   3456
4      PPP   %%%   9012

【讨论】:

  • 不知何故这只是返回一个空数据框
  • @cdubbs 您必须重新分配给df1,例如:df1 = df1.reset_index().merge(df2, on='ID').set_index('index').rename_axis(index=None) 或分配一个新名称。
  • @cdubbs 我假设df1 是第一个数据帧,df2 是第二个。这就是你给他们起的名字。如果否,请将 df1、df2 替换为您的数据框名称。
  • @cdubbs 我通过创建测试数据框进行了测试:df1 = pd.DataFrame({'ID': {1: 'UUU', 2: 'III', 3: 'OOO', 4: 'PPP'}, 'prop1': {1: '&&&', 2: '***', 3: ')))', 4: '%%%'}})df2 = pd.DataFrame({'ID': {1: 'UUU', 2: 'WWW', 3: 'III', 5: 'EEE', 6: 'OOO', 7: 'RRR', 8: 'PPP'}, 'prop2': {1: 1234, 2: 4567, 3: 7890, 5: 123, 6: 3456, 7: 6789, 8: 9012}}) 测试数据框对我来说很好,它们应该与您的示例数据相同。
  • 嗨@cdubbs 现在可以了吗?如果没有,是否有相同的空数据框定义df1df2,上面的评论中有我的代码?
【解决方案2】:

您还可以使用 .map 将 prop2 值添加到 ID 列值匹配的原始数据框中。

df1['prop2'] = df1['ID'].map(dict(df2[['ID', 'prop2']].to_numpy())

如果您的原始数据框中有任何 ID 不在第二个数据框中(因此没有 prop2 值,您可以通过添加 .fillna() 与您的值来填补这些漏洞选择。

df1['prop2'] = df1['ID'].map(dict(df2[['ID', 'prop2']].to_numpy()).fillna(your_fill_value_here)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多