我有一个具有以下形状的数据框:
Index([u'PRODUCT',u'RANK', u'PRICE', u'STARS', u'SNAPDATE', u'CAT_NAME'], dtype='object')
对于该数据帧的每个产品,我都可以获得特定日期的NaN值。
目标是将每个产品的NaN值替换为现有值的平均值。
这是我尝试过的没有成功的事情:
for product in df['PRODUCT'].unique():
df = df[df['PRODUCT'] == product]['RANK'].fillna((df[df['PRODUCT'] == product]['RANK'].mean()), inplace=True)
print df
给了我:
TypeError: 'NoneType' object has no attribute '__getitem__'
我做错了什么?
答案 0 :(得分:1)
您可以使用groupby
创建一个平均值系列:
s = df.groupby('PRODUCT')['RANK'].mean()
然后将此系列用于fillna
值:
df['RANK'] = df['RANK'].fillna(df['PRODUCT'].map(s))
答案 1 :(得分:1)
您收到此错误的原因是您使用了inplace
in fillna
。不幸的是,文档存在错误:
返回:已填充:系列
尽管如此,这显示了:
df = pd.DataFrame({'a': [3]})
>>> type(df.a.fillna(6, inplace=True))
NoneType
>>> type(df.a.fillna(6))
pandas.core.series.Series
所以当你指定
时df = df[df['PRODUCT'] == product]['RANK'].fillna((df[df['PRODUCT'] == product]['RANK'].mean()), inplace=True)
您正在分配df = None
,下一次迭代会因您收到错误而失败。
您可以省略作业df =
,或者更好的是,使用其他答案。