首页 > 解决方案 > 比较来自两个不同数据帧的多列并使用 pandas 映射值

问题描述

我有两个数据框,两个数据框中都有公共列,在比较列值时,如果两个数据框中的值匹配,则应在其中一个数据框中添加新列,如下所示。

df1:

|other_col   | col_a    | col_b   | col_c | e_values |
|:----------:|:--------:|:-------:|:-----:|:--------:|
|a           | dog      | egg     | hi    |          |
|a           | s        | f       | good  |          |
|b           | t        | u       | bad   |          |
|c           | u        | r       | data1 |          |
|d           | v        | l       | data2 |          |
|b           | w        | h       | data3 |          |

df2:

|col_1  | col_2  | col_3  | e_values              |
|:-----:|:------:|:------:|:---------------------:|
|sales  | dog    | egg    | ['sales','dog','egg'] |
|call   | s      |   f    | ['call','s','f']      |
|hello  | v      |   l    | ['hello','v','l']     |

我已经使用了逻辑

df1 = pd.merge(df1, df2, how='outer', left_on=["col_a","col_b"], right_on = ['col_1','col_2'])

我得到的输出:

|other_col   | col_a    | col_b   | col_c | col_1 |e_values               |
|:----------:|:--------:|:-------:|:-----:|:-----:|:---------------------:|
|a           | dog      | egg     | hi    |       |                       |
|a           | s        | f       | good  |       |                       |
|b           | t        | u       | bad   |       |                       |
|c           | u        | r       | data1 |       |                       |
|d           | v        | l       | data2 |       |                       |
|b           | w        | h       | data3 |       |                       |
|            | dog      | egg     |       | sales | ['sales','dog','egg'] |
|            | s        | f       |       | call  | ['call','s','f']      |
|            | v        | l       |       | hello | ['hello','v','l']     |                                        

在这种情况下,如果df2[['col_2','col_3']]中的值与df1[['col_a','col_b ']] 匹配,则应**df1中添加名为e_values的新列以及值列表正是来自 df2

预期输出:

|other_col   | col_a    | col_b   | col_c |e_values                         |
|:----------:|:--------:|:-------:|:-----:|:-------------------------------:|
|a           | dog      | egg     | hi    | ['sales','dog','egg']           |
|a           | s        | f       | good  | ['call','s','f']                |
|b           | t        | u       | bad   | no match, random list of values |
|c           | u        | r       | data1 | random values                   |
|d           | v        | l       | data2 | ['hello','v','l']               |
|b           | w        | h       | data3 | random values                   |

标签: pythonpandasdataframejoinmerge

解决方案


你可以尝试这样的事情:

df1 = pd.merge(df1, df2,  how='outer', left_on=["col_a"], right_on = ['col_2'])
df1 = df1.drop(columns=["col_1","col_2","col_3","e_values_x"])
df1 = df1.rename(columns={'e_values_y':'e_values'})
  • 使用外连接根据col_a和列合并数据框。col_1
  • 删除不需要的列
  • 重命名列 e_values,因为它存在于两个数据帧中,后缀在合并期间自动添加到它们。

推荐阅读