如何取代NaN值?

时间:2018-04-14 06:17:53

标签: python pandas numpy scikit-learn

我有一个名为smoking_status的功能,它有3个不同的值:

1)抽烟

2)以前吸烟

3)从不吸烟

功能列(sm​​oking_status)有3个以上的值以及很多NaN值我如何处理NaN值,因为我的数据不是数字,如果它是数字我可以替换它使用medianmean。如何在我的情况下替换NaN值?

enter image description here

4 个答案:

答案 0 :(得分:2)

NaN替换为unknown可能有两个更好的选择 - 至少在数据科学挑战的背景下,我认为这是:

  • 将此替换为最常见的值mode)。
  • 使用您拥有的数据预测缺失值

获得最常见的价值很容易。为此,您可以使用<column>.value_counts()获取频率,后跟.idxmax(),从而为您提供value_counts()的索引元素,频率为高。之后,您只需致电fillna()

import pandas as pd
import numpy as np

df = pd.DataFrame(['formerly', 'never', 'never', 'never', 
                   np.nan, 'formerly', 'never', 'never', 
                   np.nan, 'never', 'never'], columns=['smoked'])

print(df)
print('--')
print(df.smoked.fillna(df.smoked.value_counts().idxmax()))

给出:

     smoked
0   formerly
1      never
2      never
3      never
4        NaN
5   formerly
6      never
7      never
8        NaN
9      never
10     never
--
0     formerly
1        never
2        never
3        never
4        never
5     formerly
6        never
7        never
8        never
9        never
10       never

答案 1 :(得分:0)

您没有这些行的数据。您可以简单地填充该特征中的中位数或平均值,最常见的值。但在这个特殊情况下,考虑这个特征是一个坏主意。

更好的方法是填写一个字符串,上面写着&#39; unknown&#39; /&#39; na&#39;

df['smoking_status'].fillna('NA')

然后你可以标记编码或将列转换为一个热编码。

答案 2 :(得分:0)

看起来问题是关于方法论,而不是技术问题。

所以你可以试试

1)这三者中最常见的价值;

2)使用您的数据集的一些其他分类字段统计信息(例如,最常见的吸烟状态组);

3)随机值;

4)&#34; UNKNOWN&#34;类

然后你可以进行一次热编码,并在交叉验证时检查模型,以选择正确的方法。

还有更棘手的方法:将此状态用作目标变量,并尝试使用scikit使用所有其他数据预测这些NaN。

答案 3 :(得分:0)

分类数据示例:

ser = pd.Categorical(['non', 'non', 'never', 'former', 'never', np.nan])

填写:

ser.add_categories(['unknown']).fillna('unknown')

给你:

[non, non, never, former, never, unknown]
Categories (4, object): [former, never, non, unknown]