问题是如何在pandas数据框中为类别列填充最常用级别的NaN?
在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.
df = df.fillna(df.median())
答案 0 :(得分:35)
您可以使用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开始,Series和Dataframes包含mode
方法。
您可以使用它来填充每列的缺失值(使用其自己最常用的值),如此
df = df.fillna(df.mode().iloc[0])
答案 1 :(得分:3)
def fillna(col):
col.fillna(col.value_counts().index[0], inplace=True)
return col
df=df.apply(lambda col:fillna(col))
答案 2 :(得分:0)
在scikit-learning的最新版本中,您可以使用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
答案 3 :(得分:0)
大多数时候,您都不希望所有列都采用相同的插补策略。例如,对于分类变量,可能需要使用列模式,对于数字列,可能需要使用列均值或中位数。
# 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])