pandas DataFrame按条件分组计算、极值提取及结果叠加求助
实现方案
以下实现全程优先使用pandas内置向量化操作,避免低效的自定义函数逐行/逐组计算,数据量越大性能优势越明显。
前置处理
先拆分Cond字段的两类数据,提前计算绝对值辅助列:
import pandas as pd import numpy as np # 计算Cond='T'的分组求和结果sum_ans sum_ans = sales[sales['Cond'] == 'T'].groupby('keys')[['Col2', 'Col3']].sum() # 提取Cond='F'的子集,计算绝对值辅助列 f_df = sales[sales['Cond'] == 'F'].copy() f_df['Col2_abs'] = f_df['Col2'].abs() f_df['Col3_abs'] = f_df['Col3'].abs()
计算maxis_ans(两种方案可选)
方案1:易读性优先(适用于100万行以内数据)
def get_farthest(val_ser, abs_ser): max_abs = abs_ser.max() # 筛选出绝对值最大的候选值,绝对值相等时取正值 return val_ser[abs_ser == max_abs].max() maxis_ans = f_df.groupby('keys').apply( lambda x: pd.Series({ 'Col2': get_farthest(x['Col2'], x['Col2_abs']), 'Col3': get_farthest(x['Col3'], x['Col3_abs']) }) ) # 补全没有Cond='F'记录的分组,默认填充0 maxis_ans = maxis_ans.reindex(sum_ans.index, fill_value=0)
方案2:性能优先(适用于百万行以上大数据)
完全使用pandas内置优化操作,比自定义apply速度快5~10倍:
# Col2处理:按分组、绝对值降序、原值降序排序,去重保留第一个即为符合要求的值 col2_res = f_df.sort_values(['keys', 'Col2_abs', 'Col2'], ascending=[True, False, False])\ .drop_duplicates('keys')[['keys', 'Col2']].set_index('keys') # Col3处理逻辑同Col2 col3_res = f_df.sort_values(['keys', 'Col3_abs', 'Col3'], ascending=[True, False, False])\ .drop_duplicates('keys')[['keys', 'Col3']].set_index('keys') maxis_ans = pd.concat([col2_res, col3_res], axis=1).reindex(sum_ans.index, fill_value=0)
得到最终结果
final_result = sum_ans.add(maxis_ans, fill_value=0)
内容的提问来源于stack exchange,提问作者DaniV
相关产品推荐
相关产品推荐

