每天一点python——缺失值处理

本文介绍如何利用sklearn的Imputer类处理数据集中的缺失值,包括使用np.nan替换缺失值、通过Imputer类计算均值填充等方法。

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

在sklearn的preprocessing包中包含了对数据集中缺失值的处理,主要是应用Imputer类进行处理。

首先需要说明的是,numpy的数组中可以使用np.nan/np.NaN(Not A Number)来代替缺失值,对于数组中是否存在nan可以使用np.isnan()来判定。

使用type(np.nan)或者type(np.NaN)可以发现改值其实属于float类型,代码如下:



  1. >>>type(np.NaN)  
  2. <type 'float'>  
  3. >>>type(np.nan)  
  4. <type 'float'>  
  5. >>> np.NaN  
  6. nan  
  7. >>> np.nan  
  8. nan  


因此,如果要进行处理的数据集中包含缺失值一般步骤如下:

1、使用字符串'nan'来代替数据集中的缺失值;

2、将该数据集转换为浮点型便可以得到包含np.nan的数据集;

3、使用sklearn.preprocessing.Imputer类来处理使用np.nan对缺失值进行编码过的数据集。

代码如下:

  1. >>>from sklearn.preprocessingimport Imputer  
  2. >>> imp = Imputer(missing_values='NaN', strategy='mean', axis=0)  
  3. >>> X=np.array([[1,2], [np.nan, 3], [7,6]])  
  4. >>> Y=[[np.nan,2], [6, np.nan], [7,6]]  
  5. >>> imp.fit(X)  
  6. Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)  
  7. >>> imp.transform(Y)  
  8. array([[4.        , 2.        ],  
  9.        [6.        , 3.66666667],  
  10.        [7.        , 6.        ]])  




上述代码使用数组X去“训练”一个Imputer类,然后用该类的对象去处理数组Y中的缺失值,缺失值的处理方式是使用X中的均值(axis=0表示按列进行)代替Y中的缺失值。

当然也可以使用imp对象来对X数组本身进行处理。

通常,我们的数据都保存在文件中,也不一定都是Numpy数组生成的,因此缺失值可能不一定是使用nan来编码的,对于这种情况可以参考以下代码:

  1. >>> line='1,?'  
  2. >>> line=line.replace(',?',',nan')  
  3. >>> line  
  4. '1,nan'  
  5. >>> Z=line.split(',')  
  6. >>> Z  
  7. ['1','nan']  
  8. >>> Z=np.array(Z,dtype=float)  
  9. >>> Z  
  10. array([ 1.,  nan])  
  11. >>> imp.transform(Z)  
  12. array([[1.        , 3.66666667]])  




上述代码line模拟从文件中读取出来的一行数据,使用nan来代替原始数据中的缺失值编码,将其转换为浮点型,然后使用X中的均值填补Z中的缺失值。

转自:http://www.cnblogs.com/chaosimple/p/4153158.html

### 使用Pandas处理数据集中缺失值的方法 #### 识别缺失值 在Pandas中,可以通过`isnull()`或`isna()`函数来识别数据集中的缺失值。这些函数会返回一个与原始数据形状相同的布尔值DataFrame或Series,其中`True`表示缺失值,`False`表示非缺失值。 ```python import pandas as pd import numpy as np data = { 'A': [1, 2, np.nan], 'B': [5, np.nan, np.nan], 'C': [1, 2, 3] } df = pd.DataFrame(data) missing_values = df.isnull() print(missing_values) ``` 此代码片段展示了如何创建一个包含缺失值的数据帧并使用`isnull()`函数来识别缺失值[^3]。 #### 删除含有缺失值的行或列 对于删除操作,有几种不同的方式可以选择: - **按行删除**:如果某一行中有任何缺失值,则整行会被删除。 ```python cleaned_df_row = df.dropna(axis=0) # axis=0 表示按照行的方向进行删除 print(cleaned_df_row) ``` - **按列删除**:当某一列存在大量缺失值时,可能更倾向于移除该列而不是保留它。 ```python cleaned_df_col = df.dropna(axis=1) # axis=1 表示按照列的方向进行删除 print(cleaned_df_col) ``` 上述两种方法都允许通过设置参数来自定义行为,比如只删除完全由NA组成的行/列(`how='all'`) 或者指定每行至少要有多少个非NA值才能保留 (`thresh=n`)。 #### 替换缺失值 除了简单地丢弃带有缺失值的数据外,还可以考虑填充它们。这有助于保持样本量不变,并且有时能更好地反映实际情况。 - **用特定数值替换** ```python filled_with_value = df.fillna(value=-99999) print(filled_with_value) ``` - **前向填充(Forward Fill)** 向前填充意味着用前面最近的有效观测值去填补当前位置上的缺失值。 ```python forward_filled = df.ffill() # ffill代表前向填充 print(forward_filled) ``` - **后向填充(Backward Fill)** 相反地,也可以采用后向填充策略——即利用后面紧邻的第一个有效观察值来进行补全。 ```python backward_filled = df.bfill() # bfill代表后向填充 print(backward_filled) ``` 另外,在某些情况下,可能会希望基于统计特征(如平均数、中位数等)对缺失部分做插值估计;此时可借助于`fillna()`配合相应的聚合函数实现这一目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值