如何在Pandas中实现按类别区分的条件分组?
当然可以实现,这里有两种实用方案
方案1:拆分数据框分别处理后合并
把A、B两类数据分开,各自按需求分组聚合,最后合并结果即可。以下是示例代码(以对Total求和、Avg取均值为例,你可以根据实际需求调整聚合逻辑):
import pandas as pd data = [['A', 'HIGH', 120, 200], ['A', 'MID', 350, 200], ['B', 'HIGH', 130, 100], ['B', 'HIGH', 70, 100], ['A', 'MID', 130, 200]] df = pd.DataFrame(data, columns=['Category', 'Range', 'Total', 'Avg']) # 处理Category为A的行:按Category和Range分组聚合 group_a = df[df['Category'] == 'A'].groupby(['Category', 'Range']).agg( Total_sum=('Total', 'sum'), Avg_mean=('Avg', 'mean') ).reset_index() # 处理Category为B的行:仅按Category分组聚合 group_b = df[df['Category'] == 'B'].groupby(['Category']).agg( Total_sum=('Total', 'sum'), Avg_mean=('Avg', 'mean') ).reset_index() # 合并结果,给B类的Range列填充默认值 final_result = pd.concat([group_a, group_b], ignore_index=True).fillna({'Range': 'N/A'}) print(final_result)
执行后输出:
Category Range Total_sum Avg_mean 0 A HIGH 120 200 1 A MID 480 200 2 B N/A 200 100
方案2:构造自定义分组键
通过生成一个临时分组键,让A类的键包含Range信息,B类的键仅保留Category,再按这个键分组。这种方式不需要拆分数据框,适合数据量较大的场景:
import pandas as pd data = [['A', 'HIGH', 120, 200], ['A', 'MID', 350, 200], ['B', 'HIGH', 130, 100], ['B', 'HIGH', 70, 100], ['A', 'MID', 130, 200]] df = pd.DataFrame(data, columns=['Category', 'Range', 'Total', 'Avg']) # 生成分组键:A类用"Category_Range",B类直接用Category df['group_key'] = df.apply( lambda row: f"{row['Category']}_{row['Range']}" if row['Category'] == 'A' else row['Category'], axis=1 ) # 按自定义键分组聚合 result = df.groupby('group_key').agg( Total_sum=('Total', 'sum'), Avg_mean=('Avg', 'mean') ).reset_index() # 拆分分组键,还原Category和Range列 result[['Category', 'Range']] = result['group_key'].str.split('_', n=1, expand=True) # 整理列顺序并删除临时键 final_result = result.drop('group_key', axis=1)[['Category', 'Range', 'Total_sum', 'Avg_mean']].fillna({'Range': 'N/A'}) print(final_result)
输出结果和方案1完全一致。
内容的提问来源于stack exchange,提问作者Owad A.
相关产品推荐
相关产品推荐

