如何使用Pandas按指定列分组后替换组内其他列的现有值
原有代码问题说明
- 聚合语法错误:
agg中每个字段的聚合规则只能接收「目标列名、聚合函数」两个参数,你在course的聚合规则里多写了cohort_number列名,属于语法错误 - 自定义聚合逻辑写法错误:
graduated的判断逻辑不能直接写any(graduated="Yes"),需要单独封装成可调用的聚合函数 - 逻辑不符需求:
agg返回的是每个分组仅一行的聚合结果,无法直接替换原分组内所有行的值,应该用transform方法返回和原数据长度一致的转换结果,直接赋值到原列即可
解决方案代码
import pandas as pd # 定义graduated列的聚合逻辑 def process_graduated(group): # 组内存在Y直接返回Y if 'Y' in group.values: return 'Y' # 否则返回组内最后一个值 return group.iloc[-1] # 按sid、year分组 grouped = df.groupby(['sid', 'year']) # 直接对原df的对应列做转换赋值,单元素分组自动保持原值 df['cohort_number'] = grouped['cohort_number'].transform('last') df['course'] = grouped['course'].transform('first') df['graduated'] = grouped['graduated'].transform(process_graduated)
运行上述代码后得到的结果和你期望的输出完全一致。
内容的提问来源于stack exchange,提问作者floss
相关产品推荐
相关产品推荐

