Вменение отсутствующих значений для категорий в pandas

Вопрос в том, как заполнить NaN наиболее частыми уровнями для столбца категории в pandas dataframe?

В пакете R RandomForest есть na.roughfix: A completed data matrix or data frame. For numeric variables, NAs are replaced with column medians. For factor variables, NAs are replaced with the most frequent levels (breaking ties at random). If object contains no NAs, it is returned unaltered.

в pandas для числовых переменных я могу заполнить значения NaN с помощью

df = df.fillna(df.median())

Ответ 1

Вы можете использовать df = df.fillna(df['Label'].value_counts().index[0]), чтобы заполнить NaN наиболее частым значением из одного столбца.

Если вы хотите заполнить каждый столбец своим самым частым значением, вы можете использовать

df = df.apply(lambda x:x.fillna(x.value_counts().index[0]))

ОБНОВЛЕНИЕ 2018-25-10

Начиная с 0.13.1 pandas включает метод mode для серий и кадров данных. Вы можете использовать его, чтобы заполнить пропущенные значения для каждого столбца (используя свое наиболее частое значение), например, так:

df = df.fillna(df.mode().iloc[0])

Ответ 2

def fillna(col):
    col.fillna(col.value_counts().index[0], inplace=True)
    return col
df=df.apply(lambda col:fillna(col))

Ответ 3

В более поздних версиях scikit-learn up вы можете использовать SimpleImputer для вычисления чисел и категорий:

import pandas as pd
from sklearn.impute import SimpleImputer
arr = [[1., 'x'], [np.nan, 'y'], [7., 'z'], [7., 'y'], [4., np.nan]]
df1 = pd.DataFrame({'x1': [x[0] for x in arr],
                    'x2': [x[1] for x in arr]},
                  index=[l for l in 'abcde'])
imp = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
print(pd.DataFrame(imp.fit_transform(df1),
                   columns=df1.columns,
                   index=df1.index))
#   x1 x2
# a  1  x
# b  7  y
# c  7  z
# d  7  y
# e  4  y

Ответ 4

В большинстве случаев вам не нужна одинаковая вменяющая стратегия для всех столбцов. Например, вам может потребоваться режим столбца для категориальных переменных и среднее значение столбца или медиана для числовых столбцов.

# numeric columns
>>> df.select_dtypes(include='float').fillna(\
     df.select_dtypes(include='float').mean().iloc[0],\                    
     inplace=True)

# categorical columns
>>> df.select_dtypes(include='object').fillna(\
 ...: df.select_dtypes(include='object').mode().iloc[0])