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

如何用Python Pandas对比表格分组数据并生成指定结果集

问题描述

现有如下表格数据:

a1b1a1Eb1a1b2a1Eb2a2b1a2Eb1a2b2a2Eb2a3b1a3Eb1a3b2a3Eb2
220854356367278775
830667635456385674
554464723648467482
665753827735525364
434252428827694229

需求:对每行数据完成3组对比:

  • a1b1 与 a1b2
  • a2b1 与 a2b2
  • a3b1 与 a3b2

每组对比规则:若某列数值更小,则提取该两列数值以及更小值对应的“E列”数据(例:a1b1 < a1b2时,提取a1b1、a1b2、a1Eb1)。

已用Pandas创建DataFrame,代码如下:

import pandas as pd
import numpy as np

df = pd.DataFrame ({
    'a1b1':[2,8,5,6,4],
    'a1Eb1':[20,30,54,65,34],
    'a1b2':[8,6,4,7,2],
    'a1Eb2':[54,67,64,53,52],                   
    'a2b1':[3,6,7,8,4],
    'a2Eb1':[56,35,23,27,28],                   
    'a2b2':[3,4,6,7,8],
    'a2Eb2':[67,56,48,35,27],
    'a3b1':[2,3,4,5,6],
    'a3Eb1':[78,85,67,25,94],    
    'a3b2':[7,6,4,3,2],
    'a3Eb2':[75,74,82,64,29],  # 修正原代码笔误:将a3Eb3改为a3Eb2
})
解决方案

通过逐组判断筛选、提取符合条件的数据,具体实现步骤如下:

步骤1:定义单组对比处理函数

创建函数封装对比逻辑,传入对比列和对应E列,返回符合条件的结果:

def process_group(df, col1, col2, e_col1, e_col2):
    # 筛选col1更小的行,提取col1、col2、对应E列
    mask_col1_smaller = df[col1] < df[col2]
    res_col1 = df.loc[mask_col1_smaller, [col1, col2, e_col1]]
    
    # 筛选col2更小的行,提取col1、col2、对应E列
    mask_col2_smaller = df[col2] < df[col1]
    res_col2 = df.loc[mask_col2_smaller, [col1, col2, e_col2]]
    
    # 合并两组结果(数值相等的情况可根据需求另行处理)
    return pd.concat([res_col1, res_col2], ignore_index=True)

步骤2:处理三组对比数据

分别调用函数处理a1、a2、a3三组数据:

# 处理a1组
a1_result = process_group(df, 'a1b1', 'a1b2', 'a1Eb1', 'a1Eb2')

# 处理a2组
a2_result = process_group(df, 'a2b1', 'a2b2', 'a2Eb1', 'a2Eb2')

# 处理a3组
a3_result = process_group(df, 'a3b1', 'a3b2', 'a3Eb1', 'a3Eb2')

步骤3:查看或整合结果

可以单独查看每组结果,也可以合并所有结果:

# 查看a1组结果
print("a1组对比结果:")
print(a1_result)

# 查看a2组结果
print("\na2组对比结果:")
print(a2_result)

# 查看a3组结果
print("\na3组对比结果:")
print(a3_result)

# 可选:合并所有结果并标记分组
all_results = pd.concat(
    [a1_result, a2_result, a3_result],
    keys=['a1', 'a2', 'a3'],
    names=['group']
)
print("\n所有合并结果:")
print(all_results)

结果示例

以a1组为例,输出结果如下:

a1b1  a1b2  a1Eb1  a1Eb2
0     2     8   20.0    NaN
1     6     7   65.0    NaN
2     8     6    NaN   67.0
3     5     4    NaN   64.0
4     4     2    NaN   52.0

注:NaN表示该行不对应此E列,若需要更清晰的列名,可在函数中重命名列(例如改为small_val、large_val、small_E_val)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:15:33