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

Pandas如何计算不同分类变量对应各数值列的两两差值

实现方案

直接用Pandas+itertools即可实现需求,自动适配1000列的场景,且完全符合条目数不一致时的截断规则。

完整可运行代码

import pandas as pd
from itertools import combinations

# ---------------------- 以下替换为你自己的DataFrame读取逻辑 ----------------------
# 模拟示例数据
data = {
    'Item': ['A', 'B', 'C', 'D'],
    'Value1': [12, 14, 10, 17],
    'Value2': [24, 27, 32, 30],
    'Value3': [14, 13, 17, 15],
    'Value4': [50, 48, 89, 23],
    'Valuen': [43, 47, 49, 40]
}
df = pd.DataFrame(data)
# -----------------------------------------------------------------------------

# 按Item列分组
grouped = df.groupby('Item')
item_list = list(grouped.groups.keys())
# 自动识别所有数值列,不用手动列1000个列名
value_cols = df.columns.drop('Item')
result_buffer = []

# 遍历所有不重复的两两Item组合,不会生成B-A这类重复配对
for item_a, item_b in combinations(item_list, 2):
    # 取出两个分类的所有数据,重置索引避免索引错位
    df_a = grouped.get_group(item_a).reset_index(drop=True)
    df_b = grouped.get_group(item_b).reset_index(drop=True)
    # 取两个分类的最小行数作为有效计算长度
    valid_length = min(len(df_a), len(df_b))
    # 取前valid_length行计算差值,这里是item_a减item_b,需要绝对值可末尾加.abs()
    # 若每个Item有多行需要汇总差值,可在末尾加.sum(),即diff = (df_a... - df_b...).sum()
    diff_value = df_a.loc[:valid_length-1, value_cols] - df_b.loc[:valid_length-1, value_cols]
    # 写入配对标识
    diff_value['Difference'] = f"{item_a}-{item_b}"
    result_buffer.append(diff_value)

# 拼接所有结果,调整列顺序符合预期输出格式
final_result = pd.concat(result_buffer, ignore_index=True)
final_result = final_result[['Difference'] + list(value_cols)]

# 输出查看结果
print(final_result)

核心逻辑说明

  • 自动识别所有数值列,不管是10列还是1000列都不需要手动修改列名配置
  • 用combinations生成不重复的两两配对,避免出现重复的反向配对(如不会同时生成A-B和B-A)
  • 自动处理两个分类条目数不一致的场景,按最小条目数截断后再计算差值,超出部分直接丢弃
  • 支持单个Item对应多条数据的场景:若需要保留每行的对应差值直接运行代码即可;若需要汇总所有行的差值总和,放开代码中.sum()的注释即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:54:03