You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:15:41