基于条件聚合Pandas子组值:子组值全相同取最大值,存在不同值则求和
Pandas条件子组聚合:同值取最大,异值求和
没问题,我来帮你搞定这个需求!先把规则再明确下:我们需要对DataFrame的子组做聚合——如果子组内所有值都相同,就取该组的最大值(其实和取唯一值结果一致);如果子组里存在不同值,就对所有值求和。
示例数据与预期输出
先拿一组样例数据来演示:
import pandas as pd df = pd.DataFrame({ 'group': ['A', 'A', 'B', 'B', 'B', 'C'], 'value': [5, 5, 3, 4, 3, 7] })
按照规则,预期的聚合结果应该是:
| group | result |
|---|---|
| A | 5 |
| B | 10 |
| C | 7 |
解决方案1:直观的apply方法(适合中小数据)
这种写法简单易懂,直接对每个组做判断和聚合,适合数据量不大的场景:
def conditional_agg(group): # 判断组内是否所有值都相同 if group.nunique() == 1: return group.max() else: return group.sum() # 执行分组聚合并整理结果 result = df.groupby('group')['value'].apply(conditional_agg).reset_index(name='result') print(result)
nunique()会返回组内唯一值的数量,等于1就说明所有值一致,否则就执行求和操作。
解决方案2:高效的矢量方法(适合大数据)
如果你的数据集很大,apply的逐组循环可能会拖慢速度,我们可以用矢量操作拆分步骤,提升性能:
# 1. 标记每个组是否所有值都相同 group_flags = df.groupby('group')['value'].nunique().reset_index() group_flags['is_all_same'] = group_flags['value'] == 1 # 2. 分别计算所有组的总和与最大值 group_sum = df.groupby('group')['value'].sum().reset_index(name='sum_val') group_max = df.groupby('group')['value'].max().reset_index(name='max_val') # 3. 合并数据并根据标记选择结果 merged = pd.merge(group_flags, group_sum, on='group') merged = pd.merge(merged, group_max, on='group') merged['result'] = merged.apply(lambda x: x['max_val'] if x['is_all_same'] else x['sum_val'], axis=1) # 提取最终结果 final_result = merged[['group', 'result']] print(final_result)
这种方法把聚合操作拆成了独立的矢量计算,避免了逐组循环,在大数据集上的性能表现会好很多。
两种方法都能满足需求,根据你的数据规模选择就行啦!
内容的提问来源于stack exchange,提问作者D_S
相关产品推荐
相关产品推荐

