【问题标题】:Replace dataframe multiple columns with id from another dataframe用另一个数据框的 id 替换数据框的多列
【发布时间】:2019-05-28 15:27:38
【问题描述】:

我有 Pandas 数据框 df1 为:

ID | c1 | c2 | c3
-----------------
1  | A  | B  | 32
2  | C  | D  | 34
3  | A  | B  | 11
4  | E  | F  | 3

还有df2

ID | c1 | c2
------------
1  | A  | B
2  | C  | D
3  | E  | F

列 (c1, c2) 上的 df1df2 之间存在外键。加入样子:

pd.merge(df1, df2, left_on=['c1','c2'], right_on = ['c1','c2'])

结果是:

ID_x| c1 | c2 | c3 | ID_y
-------------------------
1   | A  | B  | 32 | 1
2   | C  | D  | 34 | 2
3   | A  | B  | 11 | 1
4   | E  | F  | 3  | 3

我想将 df1 中的 (c1,c2) 替换为 df2.id。 预期的最终 df1 是:

ID| c3 | df2_id
---------------
1 | 32 | 1
2 | 34 | 2
3 | 11 | 1
4 | 3  | 3

换句话说,我想在 df1 中添加列“df2_id”(用该行的 df2.id 值填充)并删除列 (c1,c2)(不再需要它们)。

我有这样的想法:

  1. 合并的结果保存到df1中
  2. 删除不必要的列 (c1,c2)
  3. 将“ID_y”重命名为“df2_id”,将“ID_x”重命名为“ID”

有没有更好的解决方案?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我们可以通过使用suffixes 参数和on 而不是left_on, right_on 以及使用带有drop方法链接 来为您的步骤制作一条直线:

    df1.merge(df2, on=['c1','c2'], suffixes=['_1', '_2']).drop(['c1', 'c2'], axis=1)
    

    输出

       ID_1  c3  ID_2
    0     1  32     1
    1     3  11     1
    2     2  34     2
    3     4   3     3
    

    使其与 OP 的输出完全一样:

    df1.merge(df2, on=['c1','c2'], suffixes=['', '_2']).drop(['c1', 'c2'], axis=1).rename(columns={"id_2": "df2_id"})
    

    【讨论】:

    • 哇,酷! :) 为了完美,我只会将 suffixes=['_1', '_2'] 更改为 suffixes=['', '_2'] 并在最后添加 .rename(columns={"id_2": "df2_id"} )
    • 当然,已添加@MorticiaA.Addams
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2021-09-08
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    相关资源
    最近更新 更多