请求协助:使用Pandas Groupby为DataFrame创建计算列
使用Pandas Groupby创建计算列的解决方案
结合你提供的relevant_URT_data数据示例,我整理了几个实用的分组计算列实现方案,你可以根据实际需求调整:
1. 按分组统计URT的出现次数/占比
如果想按ResCat分组,统计每个分组内test列等于URT的记录数(或占比),并将结果映射回原DataFrame的每一行:
import pandas as pd # 新增分组内URT计数列 relevant_URT_data['urt_count_in_rescat'] = relevant_URT_data.groupby('ResCat')['test'].transform( lambda x: (x == 'URT').sum() ) # 新增分组内URT占比列(URT记录数/分组总记录数) relevant_URT_data['urt_ratio_in_rescat'] = relevant_URT_data.groupby('ResCat')['test'].transform( lambda x: (x == 'URT').mean() )
2. 按分组计算Number列的聚合值
如果需要基于ResCat分组,将每个分组的Number列均值、总和等聚合结果作为新列:
# 分组计算Number列的均值 relevant_URT_data['rescat_number_mean'] = relevant_URT_data.groupby('ResCat')['Number'].transform('mean') # 分组计算Number列的总和 relevant_URT_data['rescat_number_sum'] = relevant_URT_data.groupby('ResCat')['Number'].transform('sum')
3. 标记分组内是否存在URT记录
如果想给每行标记它所在的ResCat分组是否包含至少一条URT记录:
relevant_URT_data['has_urt_in_rescat'] = relevant_URT_data.groupby('ResCat')['test'].transform( lambda x: any(x == 'URT') ).astype(int) # 转换为0/1的整数格式,方便后续分析
4. 多维度分组的自定义计算
如果需要更复杂的分组逻辑(比如同时按ResCat和MRN分组),可以这样实现:
# 按ResCat+MRN联合分组,统计每个分组内test列非空的记录数 relevant_URT_data['non_nan_test_count'] = relevant_URT_data.groupby(['ResCat', 'MRN'])['test'].transform( lambda x: x.notna().sum() )
小提醒
transform方法是核心,它能将分组聚合的结果广播回原DataFrame的每一行,保证行数不变,完美适配“给原表加计算列”的需求- 如果只需要分组后的聚合结果(不需要保留原行结构),直接用
groupby().agg()即可,但要加计算列的话优先用transform - 你可以随时替换分组键(比如把
ResCat换成其他列)和聚合逻辑,适配自己的业务场景
内容的提问来源于stack exchange,提问作者Samuel Anspach
相关产品推荐
相关产品推荐

