Pandas多层索引DataFrame取每个分组首行生成新表的实现问题
正确实现代码
你可以直接通过groupby结合first()方法实现需求,不需要额外排序(如果你的数据已经保证同一sid、vid分组内的行顺序符合预期的话):
# 方法1:直接按多层索引分组取每组第一个pageid,sid、vid作为列返回 result = df.groupby(level=['sid', 'vid'], as_index=False)['pageid'].first() # 如果需要保留sid、vid作为多层索引,去掉as_index=False即可 # result = df.groupby(level=['sid', 'vid'])['pageid'].first()
运行以上代码得到的result完全符合预期结果:
| sid | vid | pageid |
|---|---|---|
| 1 | ABC | dog |
| 2 | DEF | cat |
| 3 | GHI | pig |
原有代码问题说明
- 语法错误:
groupby(level=['sid','vid')缺少右方括号,正确写法是groupby(level=['sid','vid']) - 取值逻辑错误:不能直接在
groupby对象后加[0]取第一个值,需要调用first()、head(1)等分组聚合方法 - 内存错误原因:如果你的数据集非常大,额外执行
sort_values会产生数据副本占用大量内存,如果你不需要按ts排序后再取第一个,可以直接省略排序步骤。如果确实需要先按ts排序再取每组第一个,可以修改为更节省内存的写法:
# 需按ts排序的场景优化写法 result = df.sort_values(['sid','ts'], ascending=True).groupby(level=['sid','vid'], as_index=False).nth(0)
内容的提问来源于stack exchange,提问作者S44
相关产品推荐
相关产品推荐

