用均值替换过滤列的NaN值

时间:2018-05-17 16:17:55

标签: python pandas

我有一个具有以下形状的数据框:

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__'

我做错了什么?

2 个答案:

答案 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 =,或者更好的是,使用其他答案。