我有一个名为smoking_status
的功能,它有3个不同的值:
1)抽烟
2)以前吸烟
3)从不吸烟
功能列(smoking_status)有3个以上的值以及很多NaN
值我如何处理NaN
值,因为我的数据不是数字,如果它是数字我可以替换它使用median
或mean
。如何在我的情况下替换NaN值?
答案 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]