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

