You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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','']})

初始输出

ABCDEF
002.04.202401:00:00111103.04.202402:00:001111
103.04.202402:00:001111
204.04.202403:00:00111106.04.202405:00:001111
305.04.202404:00:00111102.04.202401:00:001111
406.04.202405:00:001111

期望输出

ABCDEF
002.04.202401:00:00111102.04.202401:00:001111
103.04.202402:00:00111103.04.202402:00:001111
204.04.202403:00:001111
305.04.202404:00:001111
406.04.202405:00:00111106.04.202405:00:001111

解决方案

核心思路是先建立有效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
)

逻辑说明

  1. 创建映射:先过滤出D、E、F都不为空的行,将这些行的(D,E,F)组合作为字典的键,对应的值就是该组合本身。
  2. 匹配更新:对每行的(A,B,C)组合,去字典中查找对应值;如果找到则替换当前行的D、E、F,找不到则保留原有值(空值维持不变)。

运行上述代码后,即可得到期望的输出结果。

内容的提问来源于stack exchange,提问作者mxplk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 23:05:03