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

如何将GroupBy结果直接合并回DataFrame并获取分组首行x值

获取分组首条记录并合并回原DataFrame

首先咱们先确认下原始数据的结构,你的DataFrame已经按id1和id2排好序了,这很关键——这样分组后的第一条就是咱们要的目标记录。

方法1:用groupby + transform(最直接高效)

transform方法能把分组计算的结果自动广播回原DataFrame的每一行,完美匹配需求:

import pandas as pd

# 你的原始数据
df = pd.DataFrame(data = [[1,1,10],[1,2,20],[1,3,50],[2,1,15],[2,2,20],[2,3,30],[3,1,40],[3,2,70]],columns=['id1','id2','x'])

# 按id1分组,提取每组第一个x值并广播到组内所有行
df['first_x'] = df.groupby('id1')['x'].transform('first')

执行后直接得到带first_x列的结果,每个id1组下的所有行都会对应组内首条记录的x值,和你预期的完全一致。

方法2:用groupby + head + merge(合并思路)

如果你习惯用表合并的逻辑,也可以先提取分组首条记录,再和原表匹配:

# 提取每个id1分组的首条记录,保留id1和x列并重命名
first_records = df.groupby('id1').head(1)[['id1', 'x']].rename(columns={'x': 'first_x'})

# 通过id1左连接,把first_x匹配到原表每一行
df = df.merge(first_records, on='id1', how='left')

这个方法逻辑直观,先拿到分组的核心数据,再通过关联完成值的填充。

方法3:用shift + ffill(利用已排序特性)

既然数据已经按id1排好序了,还可以用前向填充的思路实现:

# 标记每个id1组的第一行
df['is_first'] = df['id1'] != df['id1'].shift(1)
# 仅组内第一行保留x值,其余行设为NaN
df['first_x'] = df['x'].where(df['is_first'])
# 用前向填充把NaN替换为组内首条x值
df['first_x'] = df['first_x'].ffill()
# 删掉临时标记列
df = df.drop('is_first', axis=1)

这个方法充分利用了数据已排序的特性,适合对排序状态有明确把握的场景。

这几种方法都能达成目标,其中第一种transform的写法最简洁,推荐优先使用~

内容的提问来源于stack exchange,提问作者E. Sommer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:05:11