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

如何用Pandas查找同一ID(A列)下的字段变更(忽略E列)?

问题描述

现有如下Pandas DataFrame:

# |  A    |   B   |   C   |   D   |   E   
--+-------+-------+-------+-------+-------
1 |  "5"  |  "4"  |  "2"  |  "3"  |  "2022-11-29"  |
2 |  "5"  |  "d"  |  "2"  |  "3"  |  "2022-11-30"  |
3 |  "5"  |  "4"  |  "2"  |  "h"  |  "2022-11-29"  |
4 |  "4"  |  "4"  |  "2"  |  "3"  |  "2022-11-28"  |
5 |  "4"  |  "4"  |  "g"  |  "3"  |  "2022-11-29"  |

需要查找同一ID(A列)下的字段变更情况,但忽略E列的变动。期望结果如下:

ID 5 changed in column B (changedTovalue "d") and column D (changedTovalue "h")
ID 4 changed in column C (changedTovalue "g")

请问能否通过Pandas实现该需求?


可以实现,具体步骤及代码如下:

1. 数据准备与分组处理

先把表格转换成标准DataFrame,再按A列分组,以每组第一行数据为基准,找出其他行中与基准值不同的字段(忽略E列),收集变更的列和对应值。

2. 完整代码示例

import pandas as pd

# 构建目标DataFrame
data = {
    'A': ['5', '5', '5', '4', '4'],
    'B': ['4', 'd', '4', '4', '4'],
    'C': ['2', '2', '2', '2', 'g'],
    'D': ['3', '3', 'h', '3', '3'],
    'E': ['2022-11-29', '2022-11-30', '2022-11-29', '2022-11-28', '2022-11-29']
}
df = pd.DataFrame(data)

# 处理单个分组的函数:找出与基准值不同的字段
def extract_changes(group):
    # 取分组第一行作为基准(排除E列)
    base_vals = group.iloc[0].drop('E')
    change_records = {}
    
    # 遍历分组内每一行,对比基准值
    for _, row in group.iterrows():
        current_vals = row.drop('E')
        # 找出当前行与基准值不同的列
        diff_cols = current_vals[current_vals != base_vals].index
        for col in diff_cols:
            # 只记录首次出现的变更值,避免重复
            if col not in change_records:
                change_records[col] = current_vals[col]
    return change_records

# 按A列分组并提取变更信息
change_results = df.groupby('A').apply(extract_changes)

# 生成指定格式的输出文本
for id_val, changes in change_results.items():
    if changes:
        # 整理每个变更项的描述字符串
        change_strs = [f'column {col} (changedTovalue "{val}")' for col, val in changes.items()]
        # 处理多个变更的连接格式
        if len(change_strs) > 1:
            final_desc = ' and '.join([', '.join(change_strs[:-1]), change_strs[-1]])
        else:
            final_desc = change_strs[0]
        print(f'ID {id_val} changed in {final_desc}')

3. 运行结果

ID 4 changed in column C (changedTovalue "g")
ID 5 changed in column B (changedTovalue "d") and column D (changedTovalue "h")

补充说明

  • 代码默认以分组内第一行数据作为基准,如果需要以最新时间(E列)的行作为基准,可以先对每个分组按E列排序后再取基准值
  • 如果需要记录同一列的所有变更值,可修改逻辑去掉“避免重复”的判断,收集所有不同值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:25:28