У меня есть неполный фрейм данных, incomplete_df
, как показано ниже. Я хочу ввести недостающие amount
s в среднем amount
соответствующего id
. Если среднее значение для этого конкретного id
само является NaN (см. id=4
), я хочу использовать общее среднее значение.Pandas: Impute NaN
Ниже приведены примеры данных и мой крайне неэффективным решение:
import pandas as pd
import numpy as np
incomplete_df = pd.DataFrame({'id': [1,2,3,2,2,3,1,1,1,2,4],
'type': ['one', 'one', 'two', 'three', 'two', 'three', 'one', 'two', 'one', 'three','one'],
'amount': [345,928,np.NAN,645,113,942,np.NAN,539,np.NAN,814,np.NAN]
}, columns=['id','type','amount'])
# Forrest Gump Solution
for idx in incomplete_df.index[np.isnan(incomplete_df.amount)]: # loop through all rows with amount = NaN
cur_id = incomplete_df.loc[idx, 'id']
if (cur_id in means.index):
incomplete_df.loc[idx, 'amount'] = means.loc[cur_id]['amount'] # average amount of that specific id.
else:
incomplete_df.loc[idx, 'amount'] = np.mean(means.amount) # average amount across all id's
Какой самый быстрый и самый вещий/pandonic путь для достижения этой цели?
в 0.13 вы можете это сделать: http://pandas.pydata.org/pandas-docs/dev/missing_data.html#interpolation и увидеть раздел с отсутствующими значениями: http://pandas.pydata.org/pandas-docs /dev/missing_data.html#cleaning-filling-missing-data – Jeff
@Jeff, спасибо. Однако у меня есть не таймеры. Таким образом, статистически я ищу условное назначение, а не (inter/extra). Как я могу справиться с ситуацией, когда среднее значение данного идентификатора само по себе является «NaN»? – Rhubarb
см. Решение @DSM ниже, как его вопрос, что вы хотите. Но интерполяция CAN работает на Frames FYI; временные ряды не имеют значения. Их много вариантов. – Jeff