按产品分组用均值填充RANK列NaN值时遇TypeError报错求助
解决DataFrame按产品分组填充RANK字段NaN值的问题
你遇到的这个报错问题根源在于代码里的两个关键错误,咱们一步步拆解:
inplace=True的误用:当你设置inplace=True时,fillna()方法会直接修改原数据并返回None。你把这个None赋值给了df,后续循环里再对df做索引操作自然就会抛出TypeError,因为None没有__getitem__方法(也就是不能用[]索引)。- 循环中覆盖原DataFrame的问题:每次循环你都把
df重新赋值为单个产品的切片处理结果,这会导致原DataFrame被逐步覆盖,最后只剩下最后一个产品的数据,完全不符合你的需求。
推荐的高效解决方案
用Pandas内置的groupby+transform方法,这是处理这类分组填充问题的最优方式,不用手动写循环:
df['RANK'] = df.groupby('PRODUCT')['RANK'].transform(lambda x: x.fillna(x.mean()))
这段代码的逻辑:
groupby('PRODUCT'):按PRODUCT字段对DataFrame分组transform:将每个分组的计算结果(该组RANK的均值)广播回原DataFrame对应的位置,完美保留原数据的结构- 匿名函数里用当前分组的均值填充组内的
NaN值
如果你想保留循环思路(不推荐,效率较低)
可以修改代码避免覆盖原数据和误用inplace:
# 先复制原DataFrame,防止修改原始数据 df_filled = df.copy() for product in df['PRODUCT'].unique(): # 计算当前产品的RANK均值 rank_mean = df[df['PRODUCT'] == product]['RANK'].mean() # 定位到当前产品的RANK列,填充NaN值 df_filled.loc[df_filled['PRODUCT'] == product, 'RANK'] = df_filled.loc[df_filled['PRODUCT'] == product, 'RANK'].fillna(rank_mean) print(df_filled)
内容的提问来源于stack exchange,提问作者Cyrille MODIANO
相关产品推荐
相关产品推荐

