Pandas 熊猫会在只包含NaN的行上移动

Pandas 熊猫会在只包含NaN的行上移动,pandas,scikit-learn,imputation,Pandas,Scikit Learn,Imputation,我想结合sklearn的插补和Panda的Ffill来填充缺失的数据。 这就是我的数据帧,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行)的行填充为上一个值 如果行仅包含少数N

我想结合sklearn的插补和Panda的Ffill来填充缺失的数据。 这就是我的数据帧,
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
,例如,如果至少有一个值,则使用插补将NaN填入行中最频繁的值

我使用一个LabelEncoder将字符串值转换为整数——它是按字母顺序排列的<代码>A=0,B=1,C=2,D=3。 为了确保NaN得到值4,我使用
data=df.fillna(“Z”)

然后,我对数据进行插补,使带有
Z
的任何值都用行中最频繁的值填充——
imp=inputer(缺失值=4,策略='most\u frequency',axis=1)


因此,我想使用
ffill
填充只有
NaN
的行

然后我使用LabelEncoder和插补,用行中最频繁的值填充其他
NaN


如果我可以选择只包含
NaN
的行,并将
ffill
函数仅应用于这些行,那么我可以对另一个NaN使用插补。如何执行此操作?

您可以首先使用先前的值仅复制
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.]])

df.fillna(method='ffill',inplace=True)
。这将向前传播最后一个有效观察值,并相应地更改
Nan
值。“因此,我想使用ffill填充只有Nan的行。”这将使该行与上面的行相同。为什么不删除那一行呢?这是用于分类模型的输入-我不想删除空行