如何用Python Pandas对比表格分组数据并生成指定结果集
问题描述
现有如下表格数据:
| a1b1 | a1Eb1 | a1b2 | a1Eb2 | a2b1 | a2Eb1 | a2b2 | a2Eb2 | a3b1 | a3Eb1 | a3b2 | a3Eb2 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 20 | 8 | 54 | 3 | 56 | 3 | 67 | 2 | 78 | 7 | 75 |
| 8 | 30 | 6 | 67 | 6 | 35 | 4 | 56 | 3 | 85 | 6 | 74 |
| 5 | 54 | 4 | 64 | 7 | 23 | 6 | 48 | 4 | 67 | 4 | 82 |
| 6 | 65 | 7 | 53 | 8 | 27 | 7 | 35 | 5 | 25 | 3 | 64 |
| 4 | 34 | 2 | 52 | 4 | 28 | 8 | 27 | 6 | 94 | 2 | 29 |
需求:对每行数据完成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
相关产品推荐
相关产品推荐

