如何从pandas多重索引表中提取每个user_id对应count最大的行
问题解决方法
问题原因说明
你使用df.groupby(level=0).apply(max)时丢失date列,核心原因是max()是列级聚合函数,会对每个分组的每一列单独计算最大值,而非提取count值最大的整行数据:如果date列的类型不支持最大值计算,会被直接丢弃;就算支持计算,得到的date值也大概率和count最大值不属于同一行,不符合需求。
操作步骤
- 第一步:补全空的user_id归属
你当前存在user_id索引为空、归属上一条非空user_id的情况,需要先对空的user_id做前向填充,确保每行都属于正确分组:
import pandas as pd # 把索引转成列处理更灵活 df = df.reset_index() # 前向填充空的user_id df['user_id'] = df['user_id'].replace(['', None], pd.NA).ffill()
- 第二步:提取每个user_id下count最大的整行数据
# 定位每个分组count最大值对应的行索引,提取对应行的全部三个字段 result = df.loc[df.groupby('user_id')['count'].idxmax(), ['user_id', 'date', 'count']].reset_index(drop=True)
如果需要保留原多重索引结构,可以直接操作索引:
# 填充空的user_id索引 user_level = df.index.get_level_values(0).to_series().replace(['', None], pd.NA).ffill() df.index = df.index.set_levels([user_level, df.index.get_level_values(1)], level=[0, 1]) # 取count最大值行 result = df.loc[df.groupby(level=0)['count'].idxmax()]
- 特殊场景处理:如果同一个user_id下存在多条count同为最大值的行,需要全部保留的话,用如下代码:
result = df[df['count'] == df.groupby('user_id')['count'].transform('max')]
内容的提问来源于stack exchange,提问作者kfig
相关产品推荐
相关产品推荐

