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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:15:02