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

Pandas分组后筛选行异常求助:结果列值全为NaN

问题原因及解决方案

问题根源

你的代码在分组聚合后的列名重命名步骤出现错误,导致DataFrame的列结构异常,进而引发筛选失败。

1. 分组聚合后的初始结构

执行df.groupby(["mrn","study_id","data_categ"]).agg({sum,np.median})后,由于未指定聚合列,Pandas会自动对所有数值列(此处为data_val)应用sum和median两个聚合函数,生成的df2列是多级索引(MultiIndex):

  • 第一级列名:data_val(原数值列名)
  • 第二级列名:sum、median(聚合函数名)

2. 列名重命名的错误操作

你写的代码:

df2.columns = [df2.columns.get_level_values(1)+"_zz"]

这里多套了一层方括号。df2.columns.get_level_values(1)+"_zz"本身已经是一个包含两个合法列名的Index对象(['sum_zz', 'median_zz']),但你将其放入列表后,df2的列会变成一个以Index对象为名称的单列,彻底破坏了DataFrame的正常列结构。

3. 筛选异常的原因

当你执行df2[df2.mrn==263]时,异常的列结构导致布尔索引的匹配逻辑混乱,最终出现"仅mrn列有值、其余列全为NaN且保留所有行"的错误结果。

解决方案

修改列名重命名的代码,去掉多余的方括号,同时建议明确指定聚合列以避免歧义:

import pandas as pd
import numpy as np

df = pd.DataFrame({'mrn':[263,263,263,273,273,273],'study_id':['st_1','st_1','st_1','st_2','st_2','st_2'],'data_categ':['pre_event','during_event','post_event','pre_event','during_event','post_event'],'data_val':[12,15,9,2,9,0]},columns=['mrn','study_id','data_categ','data_val'])

# 明确指定聚合列,避免自动匹配列的歧义
df2 = df.groupby(["mrn","study_id","data_categ"])['data_val'].agg(['sum', np.median])
# 正确重命名列:直接使用Index对象设置列名
df2.columns = df2.columns + "_zz"
df2 = df2.reset_index()

# 此时筛选可正常返回目标数据
print(df2[df2.mrn==263])

执行后即可得到符合条件的3行数据,所有列值正常显示。


内容的提问来源于stack exchange,提问作者CRB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:42:07