dataframe缺失值(NaN)处理

在机器学习的特征工程中,处理DataFrame的缺失值(NaN)至关重要。通常,可以采取填补或不处理两种策略。对于 sklearn 的算法,通常需要填补NaN,而 lightgbm 等算法则可以接受缺失值。填充值的选择应考虑业务含义,避免丢失重要信息。数据质量直接影响模型效果,而判断缺失值可使用 np.isnan(), pd.isna() 或 pd.isnull()。万能方法是利用 np.nan 不等于自身的特性筛选非缺失值。" 11949991,1826915,构建静态zlib与openssl,"['zlib', 'openssl', '编译', '静态库']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dataframe缺失值(NaN)处理

    在进行机器学习的特征工程时,常常需要根据选择的机器学习算法,采用合适的数据预处理方式,特别是对于对于空值(NaN)的处理,常常使人感到困惑。
    一般对于NaN,常常有两种处理方式。第一种——填补。第二种——不处理。
    当你使用sklearn库进行机器学习训练时,一般对于缺失值要求较为严格,因此,需要进行填补,至于填补为何值,则需要根据业务需求进行。
    当你使用lightgbm库一类库进行机器学习训练时,一般不需要处理缺失值,因为这类算法,天然支持缺失值处理,它会将缺失值单独分为一类。
    本人认为,数据的缺失,在实际中是存在一定的业务含义的,例如月收入的缺失,就反应人对于自己收入的不自信,因此在风控领域就存在更容易逾期现象。但此时若是进行均值的缺失值填补,则会使该业务含义消失,因此我觉得是不可取的。
     数据的特征工程决定数据质量,数据质量决定模型效果上限,模型参数决定训练的模型能否逼近理论模型,特征工程的难易复杂程度决定模型最终上线的工作量。
(以上为本人的一点点见解)

    判断缺失值的函数有:np.isnan()/ pd.isna()/pd.isnull()。
    np.isnan():一般用于单个值,也可以用于Series或者DataFrame,但是这里存在一个坑,np.isnan()判断datetime类型的Series或者DataFrame会报错。

    pd.isna()和pd.isnull():用的比较多,一般推荐使用pd.isna()

s1 = pd.Series([1,2,3,np.nan])
np.isnan(s1)
>>> 0    False
	1    False
	2    False
	3     True
	dtype: bool

pd.isna(s1)
>>> 0    False
	1    False
	2    False
	3     True
	dtype: bool

pd.isnull(s1)
>>> 0    False
	1    False
	2    False
	3     True
	dtype: bool

    除了以上的方法之外,还有一种较为方便和万能的方法来判断缺失值,取出非缺失值进行处理(本人一般也采用这种方法)。
    通过对np.nan==np.nan发现,np.nan是不会等于np.nan,因此我们可以通过以下方式取出非缺失值。

np.nan==np.nan
>>> False
s1 = pd.Series([1,2,3,np.nan])
s1==s1
>>> 0     True
	1     True
	2     True
	3    False
	dtype: bool
#获取非缺失值
s1[s1==s1]
>>> 0    1.0
	1    2.0
	2    3.0
	dtype: float64
#获取非缺失值的数量
len(s1[s1==s1])
>>>3
#对缺失值进行填补(除了fillna外的方式)
s1[~(s1==s1)]=0
s1
>>> 0    1.0
	1    2.0
	2    3.0
	3    0.0
	dtype: float64

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值