Заменить значения NaN отфильтрованного столбца на среднее - PullRequest
0 голосов
/ 17 мая 2018

У меня есть фрейм данных со следующей формой:

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 голосов
/ 17 мая 2018

Причина, по которой вы получаете эту ошибку, заключается в том, что вы используете inplace в 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 = или, что еще лучше, использоватьдругой ответ.

0 голосов
/ 17 мая 2018

Вы можете использовать groupby для создания средней серии:

s = df.groupby('PRODUCT')['RANK'].mean()

Затем используйте эту серию для fillna значений:

df['RANK'] = df['RANK'].fillna(df['PRODUCT'].map(s))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...