我想结合sklearn的imputation和Panda的Ffill来填补缺失的数据。这是我的dataFrame df
的样子
FeatA FeatB FeatC FeatD
B A B D
NaN NaN NaN NaN
A A B C
NaN A A A
NaN B A A
我想使用Ffill来填充仅包含NaN
(例如行2)的行,与先前的值。
如果行只包含几个NaN
,例如,如果至少有一个值,使用imputation用该行中最频繁的值填充NaN。
我使用LabelEncoder将字符串值转换为整数-它是按字母顺序排列的。A=0, B=1, C=2, D = 3
。为了确保NaN得到值4,我使用data = df.fillna("Z")
然后我计算数据,以便任何具有Z
的值都填充行-中最频繁的值imp = Imputer(missing_values=4, strategy= 'most_frequent', axis=1)
所以,我想用ffill
填充只有NaN
的行。
然后我使用LabelEncoder和imputation来填充行中最频繁的值的其他NaN
。
如果我可以选择只包含NaN
的行,并仅对这些行应用ffill
函数,那么我可以在另一个Nan上使用imputation。我该怎么做呢?
您可以首先复制Nan
仅行与它的前一个值,并继续如下所示:
## Select rows containing all Nan values and replace them with the preceding values
In [2]: df.loc[df.isnull().all(axis=1), :] = df.ffill()
In [3]: df.fillna('Z', inplace=True)
初始化LabelEncoder
并执行fit
:
In [4]: enc = LabelEncoder()
In [5]: enc.fit(np.unique(df.values))
Out[5]: LabelEncoder()
In [6]: df = df.apply(enc.transform)
用最频繁的元素沿列计算缺失值:
In [7]: imp = Imputer(missing_values=4, strategy='most_frequent', axis=1)
In [8]: imp.fit_transform(df)
Out[8]:
array([[ 1., 0., 1., 3.],
[ 1., 0., 1., 3.],
[ 0., 0., 1., 2.],
[ 0., 0., 0., 0.],
[ 0., 1., 0., 0.]])