1

我有 Pandas Dataframe 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

我想用df2.id替换df1中的 (c1,c2) 。预期的最终 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”

有没有更好的解决方案?

4

1 回答 1

2

我们可以通过使用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"})
于 2019-05-28T15:34:28.447 回答