Pandas数据匹配:将匹配的D+E+F行移至对应A+B+C行
匹配DataFrame行列组合并更新列值
需求
当某行的A、B、C列组合值与另一行的D、E、F列组合值匹配时,将该D、E、F列的内容移至对应A、B、C行的D、E、F列。尝试过mask、replace、sort等方法未成功,寻求解决方案。
初始数据
代码定义
import pandas as pd df = pd.DataFrame({"A":['02.04.2024','03.04.2024', '04.04.2024', '05.04.2024', '06.04.2024',], "B":['01:00:00', '02:00:00', '03:00:00', '04:00:00', '05:00:00'], "C":['1111', '1111', '1111', '1111', '1111'], "D":['03.04.2024', '', '06.04.2024', '02.04.2024', ''], "E":['02:00:00', '', '05:00:00', '01:00:00',''], "F":['1111','', '1111', '1111','']})
初始输出
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 0 | 02.04.2024 | 01:00:00 | 1111 | 03.04.2024 | 02:00:00 | 1111 |
| 1 | 03.04.2024 | 02:00:00 | 1111 | |||
| 2 | 04.04.2024 | 03:00:00 | 1111 | 06.04.2024 | 05:00:00 | 1111 |
| 3 | 05.04.2024 | 04:00:00 | 1111 | 02.04.2024 | 01:00:00 | 1111 |
| 4 | 06.04.2024 | 05:00:00 | 1111 |
期望输出
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 0 | 02.04.2024 | 01:00:00 | 1111 | 02.04.2024 | 01:00:00 | 1111 |
| 1 | 03.04.2024 | 02:00:00 | 1111 | 03.04.2024 | 02:00:00 | 1111 |
| 2 | 04.04.2024 | 03:00:00 | 1111 | |||
| 3 | 05.04.2024 | 04:00:00 | 1111 | |||
| 4 | 06.04.2024 | 05:00:00 | 1111 | 06.04.2024 | 05:00:00 | 1111 |
解决方案
核心思路是先建立有效D/E/F组合到自身的映射,再用每行的A/B/C组合去匹配该映射,完成列值更新:
# 筛选出D、E、F均非空的行,创建组合映射 mask = df[['D', 'E', 'F']].ne('').all(axis=1) mapping = df.loc[mask].set_index(['D', 'E', 'F'])[['D', 'E', 'F']].to_dict('index') # 遍历每行,用A/B/C组合匹配映射,更新D/E/F列 df[['D', 'E', 'F']] = df.apply( lambda row: mapping.get((row['A'], row['B'], row['C']), row[['D', 'E', 'F']]), axis=1 )
逻辑说明
- 创建映射:先过滤出D、E、F都不为空的行,将这些行的
(D,E,F)组合作为字典的键,对应的值就是该组合本身。 - 匹配更新:对每行的
(A,B,C)组合,去字典中查找对应值;如果找到则替换当前行的D、E、F,找不到则保留原有值(空值维持不变)。
运行上述代码后,即可得到期望的输出结果。
内容的提问来源于stack exchange,提问作者mxplk
相关产品推荐
相关产品推荐

