Python 熊猫类缺失值的插补

Python 熊猫类缺失值的插补,python,pandas,Python,Pandas,问题是如何在数据帧中用类别列的最频繁级别填充NAN 在R randomForest包中有 选项:完整的数据矩阵或数据帧。对于数值变量,NAs将替换为列中间值。对于因子变量,NAs被替换为最频繁的级别(随机打破联系)。如果对象不包含NAs,则会原封不动地返回。 对于数值变量,我可以用以下内容填充NaN值: df = df.fillna(df.median()) 您可以使用df=df.fillna(df['Label'].value_counts().index[0])用一列中最频繁的值填充NAN

问题是如何在数据帧中用类别列的最频繁级别填充NAN

在R randomForest包中有 选项:
完整的数据矩阵或数据帧。对于数值变量,NAs将替换为列中间值。对于因子变量,NAs被替换为最频繁的级别(随机打破联系)。如果对象不包含NAs,则会原封不动地返回。

对于数值变量,我可以用以下内容填充NaN值:

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

您可以使用
df=df.fillna(df['Label'].value_counts().index[0])
用一列中最频繁的值填充NAN

如果您想用自己最常用的值填充每一列,您可以使用

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

更新2018-25-10

0.13.1开始
pandas包括用于和的
模式
方法。 您可以使用它来填充每列缺少的值(使用它自己的最频繁值),如下所示

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

在较新版本的scikit learn up中,您可以使用
SimpleComputer
来插补数字和分类:

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

大多数情况下,您不希望所有列都采用相同的插补策略。例如,您可能希望分类变量采用列模式,数字列采用列平均值或中位数

例如:

df = pd.DataFrame({'num': [1.,2.,4.,np.nan],'cate1':['a','a','b',np.nan],'cate2':['a','b','b',np.nan]})

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

# categorical columns
>>> df.fillna(df.select_dtypes(include='object').mode().iloc[0], inplace=True)

>>> print(df)

     num cate1 cate2
 0 1.000     a     a
 1 2.000     a     b
 2 4.000     b     b
 3 2.333     a     b

谢谢,它起作用了。我还发现我可以使用numpy
np.asscalar((mode(df['Label'])[0])
在第一种情况下,
df.fillna
使用一个
inplace
关键字,您可以将该关键字设置为
True
,这使得代码更加简洁。我没有想到/知道.iloc[0]甚至适用于df.mode()。虽然df.mode()的工作方式与df.mean()类似。谢谢你!谢谢,它对我也有效,但是有没有一种方法可以突出显示插补值,只是为了交叉验证。如果我们对分类列使用inplace=True,它不会替换缺少的值。你能调查一下吗?@Chethan,谢谢你提出来。您只需添加
inplace=True
。我已经更新了代码。
df = pd.DataFrame({'num': [1.,2.,4.,np.nan],'cate1':['a','a','b',np.nan],'cate2':['a','b','b',np.nan]})

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

# categorical columns
>>> df.fillna(df.select_dtypes(include='object').mode().iloc[0], inplace=True)

>>> print(df)

     num cate1 cate2
 0 1.000     a     a
 1 2.000     a     b
 2 4.000     b     b
 3 2.333     a     b