如何将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
相关产品推荐
相关产品推荐

