Pandas 填充仅包含 NaN 的行

Pandas Ffill on rows that contain only NaN

我想结合sklearn的imputation和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,例如,如果至少有 1 个值,则使用插补法用行中出现频率最高的值填充 NaN。

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

然后我对数据进行估算,以便 Z 的任何值都填充行中出现频率最高的值 – imp = Imputer(missing_values=4, strategy= 'most_frequent', axis=1)

所以,我想使用 ffill.

填充只有 NaN 的行

然后我使用 LabelEncoder 和插补来用行中出现频率最高的值填充其他 NaN

如果我可以 select 仅包含 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.]])