Python 熊猫类缺失值的插补
问题是如何在数据帧中用类别列的最频繁级别填充NAN 在R randomForest包中有 选项: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
完整的数据矩阵或数据帧。对于数值变量,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