如何在Pandas中分组后获取组内首个分数并生成参考列?
解决方案
直接给出可运行的代码,实现你需要的reference_score列:
import pandas as pd # 构造原始数据框 df = { 'name': ['A', 'A', 'B', 'B', 'B', 'C', 'C'], 'name_ID' : [1, 1, 2, 2, 2, 3, 3], 'score' : [400, 500, 3000, 1000, 4000, 600, 750], 'score_number' : [1, 2, 1, 2, 3, 1, 2] } df = pd.DataFrame(df) # 步骤1:为每组所有行填充该组的首个分数 df['reference_score'] = df.groupby('name_ID')['score'].transform('first') # 步骤2:将每组的第一行(score_number=1)设为NaN df['reference_score'] = df['reference_score'].where(df['score_number'] != 1, pd.NA) print(df)
运行后输出结果:
name name_ID score score_number reference_score 0 A 1 400 1 NaN 1 A 1 500 2 400 2 B 2 3000 1 NaN 3 B 2 1000 2 3000 4 B 2 4000 3 3000 5 C 3 600 1 NaN 6 C 3 750 2 600
原方法失效原因
你之前用groupby(...).first()直接赋值时,返回的是仅包含每组首个值的Series,其索引是分组键(name_ID),和原数据框的行索引不匹配,导致赋值后大部分行都是NaN。而transform('first')会把每组的首个分数广播到该组的每一行,保证索引和原数据框完全对齐,之后再通过where或mask替换每组第一行的值即可。
无score_number列的通用实现
如果你的数据中没有score_number列,也可以用cumcount()判断每组第一行:
df['reference_score'] = df.groupby('name_ID')['score'].transform('first') # cumcount()从0开始计数,等于0的就是每组第一行 df['reference_score'] = df['reference_score'].mask(df.groupby('name_ID').cumcount() == 0, pd.NA)
内容的提问来源于stack exchange,提问作者tab_stopp
相关产品推荐
相关产品推荐

