处理缺失值

博客介绍了处理缺失值的方法。一是删除缺失值占比大的变量或样本;二是用平均值等替代,但会增加噪声;三是用其他变量预测缺失变量,效果一般;四是将变量映射到高维空间,能保留全部信息,但计算量大,样本量大时效果才好。

处理缺失值主要有以下几种方法:

1.当某个变量或者某个样本中缺失值占比过大时,那么我们可以认为这一变量或者样本没有意义,可以直接删除。

2.用平均值、中值、分位数、众数、随机值等替代。效果一般,因为等于人为增加了噪声。

3.用其他变量做预测模型来算出缺失变量。效果比方法2略好。有一个根本缺陷,如果其他变量和缺失变量无关,则预测的结果无意义。如果预测结果相当准确,则又说明这个变量是没必要加入建模的。一般情况下,介于两者之间。

4.把变量映射到高维空间。比如性别,有男、女、缺失三种情况,则映射成3个变量:是否男、是否女、是否缺失。连续型变量也可以这样处理。比如Google、百度的CTR预估模型,预处理时会把所有变量都这样处理,达到几亿维。这样做的好处是完整保留了原始数据的全部信息、不用考虑缺失值、不用考虑线性不可分之类的问题。缺点是计算量大大提升。

而且只有在样本量非常大的时候效果才好,否则会因为过于稀疏,效果很差。



转:https://www.jianshu.com/p/500d5a20d4ec

<think>我们聚焦于从CSV文件读取数据处理缺失值方法。根据引用内容,我们可以总结出以下几种关键方法:1.**指定数据类型**:在读取CSV,通过`dtype`参数指定列的数据类型,避免因类型推断错误导致的缺失值处理问题(引用[1])。2.**控制缺失值标记**:使用`keep_default_na`参数和`na_values`参数来定义哪些值应被视为缺失值(引用[1][3])。3.**解析日期列**:对于日期列,使用`parse_dates`参数确保正确解析,避免因解析失败而产生的缺失值(引用[3])。4.**读取后填充缺失值**:读取数据后,使用`fillna()`方法填充缺失值,例如用平均值填充(引用[4])。下面我们将详细展开这些方法。###方法1:读取指定缺失值标识Pandas在读取CSV默认将某些字符串(如空字符串、'NA'、'N/A'等)视为缺失值(NaN)。我们可以通过参数控制这一行为:```pythonimportpandasaspd#示例1:不将任何值视为缺失值(保留原始字符串)df=pd.read_csv('data.csv',keep_default_na=False)#示例2:自定义缺失值标识(将空字符串和'NULL'视为缺失值)df=pd.read_csv('data.csv',na_values=['','NULL'])```>**注意**:`keep_default_na=False`会禁用默认的缺失值标识列表,仅识别自定义的`na_values`[^1][^3]。###方法2:读取后处理缺失值读取数据后,我们可以使用`fillna()`方法填充缺失值:```python#用特定值填充所有缺失值df_filled=df.fillna(0)#用0填充#按列填充df['age'].fillna(df['age'].mean(),inplace=True)#用年龄平均值填充[^4]```###方法3:智能解析日期列日期解析失败可能导致缺失值使用`parse_dates`参数可减少此类问题:```python#将指定列解析为日期类型df=pd.read_csv('data.csv',parse_dates=['birth_date'])#检查解析结果print(df['birth_date'].dtype)#应输出datetime64[ns]```###方法4:结合类型指定与缺失值处理在指定列类型的同处理缺失值:```python#定义转换函数:将空字符串转为NaN,再转换为0defconvert_salary(val):ifval=='':return0.0try:returnfloat(val)except:return0.0df=pd.read_csv('data.csv',converters={'salary':convert_salary})```###完整示例:从读取到填充```pythonimportpandasaspd#步骤1:读取设置df=pd.read_csv('employee_data.csv',na_values=['NA','N/A',''],#自定义缺失值标识parse_dates=['hire_date'],#解析日期列dtype={'department':'category'}#指定分类类型)#步骤2:检查缺失值print("缺失值统计:\n",df.isnull().sum())#步骤3:填充数值列(年龄用中位数,薪资用0)df['age'].fillna(df['age'].median(),inplace=True)df['salary'].fillna(0,inplace=True)#步骤4:填充类别列(用众数)df['department'].fillna(df['department'].mode()[0],inplace=True)```###关键参数总结|参数|作用|示例值||-------------------|----------------------------------------------------------------------|----------------------------------||`na_values`|指定哪些字符串应被视为缺失值|`['','NA','NULL']`||`keep_default_na`|是否启用默认缺失值标识列表|`False`(禁用默认列表)||`dtype`|指定列的数据类型|`{'age':float,'name':str}`||`parse_dates`|将指定列解析为日期类型|`['date_column']`||`converters`|自定义列转换函数|`{'salary':convert_func}`|>**最佳实践**:对于关键数值列,建议同使用`dtype`和`na_values`以确保正确处理[^1][^3]。###不同类型缺失值处理策略1.**数值列**:用均值、中位数或特定值(如0)填充2.**类别列**:用众数或新增类别(如"Unknown")填充3.**间序列**:用前后相邻值插补(`df.fillna(method='ffill')`)§§相关问题§§1.如何在Pandas中识别数据集的缺失值模式?2.处理间序列数据缺失值的特殊方法有哪些?3.使用Scikit-Learn构建模型如何自动处理缺失值?4.缺失值插补(imputation)的统计学原理是什么?</think>### 在读取CSV文件处理缺失值的完整指南 处理CSV文件中的缺失值是数据预处理的关键步骤。以下是基于Pandas的多种解决方案: #### 一、读取控制缺失值识别 1. **禁用默认缺失值识别** ```python # 不将任何值自动识别为NaN(保留原始空字符串) df = pd.read_csv('data.csv', keep_default_na=False) ``` 2. **自定义缺失值标识** ```python # 指定多种缺失值标记(包括空字符串和自定义值) df = pd.read_csv('data.csv', na_values=['', 'NA', 'N/A', 'null', '-'], keep_default_na=True) ``` #### 二、读取后处理缺失值 3. **填充数值列缺失值** ```python # 用列均值填充 df['age'].fillna(df['age'].mean(), inplace=True) # 用中位数填充 df['salary'].fillna(df['salary'].median(), inplace=True) ``` 4. **处理类别/文本列缺失值** ```python # 用众数(最频繁值)填充 df['department'].fillna(df['department'].mode()[0], inplace=True) # 用特定字符串标记缺失 df['comment'].fillna('(未填写)', inplace=True) ``` #### 三、高级处理技巧 5. **条件填充** ```python # 按分组均值填充 df['income'] = df.groupby('education')['income'].transform( lambda x: x.fillna(x.mean()) ) ``` 6. **插值法处理间序列** ```python # 间序列前向填充 df = pd.read_csv('sales.csv', parse_dates=['date']) df['revenue'] = df['revenue'].interpolate(method='time') ``` #### 四、缺失值分析流程 ```python import pandas as pd # 1. 读取数据并识别缺失值 df = pd.read_csv('data.csv', na_values=['NA', 'N/A']) print("缺失值统计:\n", df.isnull().sum()) # 2. 可视化缺失分布 import seaborn as sns sns.heatmap(df.isnull(), cbar=False) # 3. 按列类型处理 for col in df.columns: if df[col].dtype == 'object': df[col].fillna('Missing', inplace=True) else: df[col].fillna(df[col].median(), inplace=True) # 4. 验证处理结果 assert df.isnull().sum().sum() == 0 # 确保无缺失值 ``` #### 关键参数说明 | 参数 | 作用 | 示例 | |------|------|------| | `na_values` | 指定缺失值标识 | `na_values=['NULL', 'NaN']` | | `keep_default_na` | 是否启用默认NaN识别 | `keep_default_na=False` | | `dtype` | 指定列数据类型 | `dtype={'age': float}` | | `parse_dates` | 日期列自动解析 | `parse_dates=['birth_date']` | > **最佳实践**: > 1. 优先在`read_csv()`中使用`na_values`明确定义缺失值[^1][^3] > 2. 数值列用统计量(均值/中位数)填充[^4] > 3. 类别列用众数或专用标记填充 > 4. 间序列使用插值法 > 5. 处理完成后用`df.isnull().sum()`验证 #### 不同类型数据的处理建议 | 数据类型 | 推荐方法 | 注意事项 | |----------|----------|----------| | 连续数值 | 均值/中位数填充 | 注意异常值影响 | | 类别数据 | 众数/"Unknown"标记 | 保持类别平衡 | | 间序列 | 间插值 | 确保间索引正确 | | 文本数据 | 空字符串填充 | 避免引入歧义 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值