2

我想结合 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

我想使用 FfillNaN用前一个值填充仅包含(例如第 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)

所以,我想填充只有NaNusing的行ffill

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

如果我可以选择仅包含的行NaN并将ffill函数仅应用于这些行,那么我可以对另一个 Nan 使用插补。我怎样才能做到这一点?

4

1 回答 1

0

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.]])
于 2016-08-16T10:34:08.237 回答