python - 比较来自两个不同数据帧的多列并使用 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 |
解决方案
你可以尝试这样的事情:
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,因为它存在于两个数据帧中,后缀在合并期间自动添加到它们。
推荐阅读
- python - 如果有握手或握手失败,Python 会打印消息
- named-entity-recognition - 用 Duckling 识别没有介词的年份
- python-3.x - python - 删除范围循环末尾的空格(int)
- javascript - javascript过滤数组内对象内的数组
- reactjs - 将两个 React 应用程序合并为一个
- java - 如何将 NonNull 注释正确导入 android studio?
- swift - 快速访问级别
- python - 为另一个 DataFrame 中的每个唯一值复制整个 DataFrame
- mysql - MYSQL 查询中的子串索引问题
- java - 在配置 Spring WebClient 代理时如何更改 DEFAULT_CONNECT_TIMEOUT_MILLIS?