【问题标题】:How to merge two dataframes based on different columns in one dataframe?如何根据一个数据框中的不同列合并两个数据框?
【发布时间】:2021-11-20 19:51:53
【问题描述】:

我有两个数据框:

df1 = pd.DataFrame({'id1':[3,2,1,4,5],'id2':[8,7,6,9,10]})
df2 = pd.DataFrame({'id3':[6,2,8,5,4],'Name':['a','b','c','e','d']})

df1

id1   id2
3     8
2     7
1     6
4     9
5     10

df2


id3   Name
6     a
2     b
8     c
5     e
4     d

说明

  • df1 由 2 列(id1 和 id2)组成,它们代表两列的唯一值。

  • df2 由 2 列(id3 和 name)组成,它们也代表唯一值。

  • df2 的

    id3 列由 df1 行中的任一值组成,其顺序也是随机的。示例 - 让我们取 id3 列的第一个值,即 6。它是通过选择 df1 的第三行的随机值制成的。类似地,2 是从 df1 的第二行中选取随机值制成的。等等..

现在我想根据 id3 列上的可用性,通过 df2 的 id3 和 df1 的 id1 或 id2 合并这两个数据帧。因此,最终的数据框将如下所示:

id1 id2 id3 Name
3   8   8   c
2   7   2   b
1   6   6   a
4   9   4   d
5   10  5   e

谁能帮我解决这个问题?

【问题讨论】:

  • 为什么不使用该逻辑将id3 列添加到df1,而不是在单独的步骤中执行呢?例如,df1["id3"] = df1.apply(lambda r: random.choice(r[["id1", "id2"]]), axis=1) 然后分配 df1["name"] = list("abcde")?
  • df1 = pd.DataFrame({'id1':[2,6,3,4,5],'id2':[6,7,8,9,10]})df2 不变的情况下的预期输出是什么?
  • @ddejohn df1 和 df2 数据帧只是来自已经可用的大量实际数据帧的样本

标签: python pandas dataframe merge


【解决方案1】:

您可以合并 2 次:首先在 id1/id3 上,然后在 id2/id3 上,然后加入 2 个数据帧:

更新

我也想恢复 df1 在 out dataframe 中的值的顺序。

out = pd.concat([df1.reset_index().merge(df2, left_on='id1', right_on='id3'),
                 df1.reset_index().merge(df2, left_on='id2', right_on='id3')]) \
        .sort_values('index').drop(columns='index').reset_index(drop=True)

输出:

>>> out
   id1  id2  id3 Name
0    1    6    6    a
1    2    7    2    b
2    3    8    8    c
3    4    9    4    d
4    5   10    5    e

【讨论】:

  • 您能否恢复 df1 中值的顺序,而不是按名称列排序,它也会自动排序名称?
  • 喜欢.sort_values(['id1', 'id2'])?
  • 数据框的值可以是任意的,而不是数字或字母。因此,根据列值对数据框进行排序并不理想。我也想恢复df1out 数据框中的值的顺序。我会更新我的问题,这可能会帮助您更好地理解
  • 我更新了我的答案。我从df1 重置索引以保持合并顺序,然后对列index 中的值进行排序
  • 谢谢,帮了大忙
猜你喜欢
  • 2020-10-20
  • 2021-10-24
  • 1970-01-01
  • 2023-01-13
  • 2021-10-05
  • 2021-01-11
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
相关资源
最近更新 更多