空值处理
pandas对缺失值的处理
pandas使用这些函数处理缺失值:
isnull和notnull:检测是否是空值,可用于df和series
dropna:丢弃、删除缺失值
axis:删除行还是列,{ 0 or 'index' 按行删除 , 1 or 'column' 按列删除},default 0
how:如果等于any则任何值为空都删除,如果等于all则所有值为空才删除
inplace:如果为True,则修改当前df,否则返回新的df
fillna:填充空值
value:用于填充的值。可以是单个值,或者字典(key是列名,value是值)
method:等于ffill时使用前一个不为空的值填充forword fill,等于bfill使用后一个不为空的值填充backword fill
axis:按行还是列填充,{ 0 or 'index' , 1 or 'column'}
inplace:如果为True,则修改当前df,否则返回新的df
python缺失值有3种:
1)Python内置的None值。None,使用df['date'].isnull()进行判断是否为空值。
2)在pandas中,将缺失值表示为NA,表示不可用not available。
3)对于数值数据,pandas使用浮点值NaN(Not a Number)表示缺失数据。
所以,缺失值有3种:None,NA,NaN
import pandas as pd
实例:特殊excel的读取、清洗、处理
步骤1:读取excel的时候,忽略前几个空行
study=pd.read_excel('student.xlsx',skiprows=4)
study
| Unnamed: 0 | Unnamed: 1 | 姓名 | 科目 | 分数 | |
|---|---|---|---|---|---|
| 0 | NaN | NaN | 小明 | 语文 | 85.0 |
| 1 | NaN | NaN | NaN | 数学 | 80.0 |
| 2 | NaN | NaN | NaN | 英语 | 90.0 |
| 3 | NaN | NaN | NaN | NaN | NaN |
| 4 | NaN | NaN | 小王 | 语文 | 85.0 |
| 5 | NaN | NaN | NaN | 数学 | NaN |
| 6 | NaN | NaN | NaN | 英语 | 90.0 |
| 7 | NaN | NaN | NaN | NaN | NaN |
| 8 | NaN | NaN | 小刚 | 语文 | 85.0 |
| 9 | NaN | NaN | NaN | 数学 | 80.0 |
| 10 | NaN | NaN | NaN | 英语 | 90.0 |
步骤2:检测空值
study.isnull()
| Unnamed: 0 | Unnamed: 1 | 姓名 | 科目 | 分数 | |
|---|---|---|---|---|---|
| 0 | True | True | False | False | False |
| 1 | True | True | True | False | False |
| 2 | True | True | True | False | False |
| 3 | True | True | True | True | True |
| 4 | True | True | False | False | False |
| 5 | True | True | True | False | True |
| 6 | True | True | True | False | False |
| 7 | True | True | True | True | True |
| 8 | True | True | False | False | False |
| 9 | True | True | True | False | False |
| 10 | True | True | True | False | False |
study['分数'].isnull()
0 False
1 False
2 False
3 True
4 False
5 True
6 False
7 True
8 False
9 False
10 False
Name: 分数, dtype: bool
study['姓名'].notnull()
0 True
1 False
2 False
3 False
4 True
5 False
6 False
7 False
8 True
9 False
10 False
Name: 姓名, dtype: bool
study['姓名'].notna()
0 True
1 False
2 False
3 False
4 True
5 False
6 False
7 False
8 True
9 False
10 False
Name: 姓名, dtype: bool
筛选没有空分数的所有行
study.loc[study['分数'].notnull(),:]
| Unnamed: 0 | Unnamed: 1 | 姓名 | 科目 | 分数 | |
|---|---|---|---|---|---|
| 0 | NaN | NaN | 小明 | 语文 | 85.0 |
| 1 | NaN | NaN | NaN | 数学 | 80.0 |
| 2 | NaN | NaN | NaN | 英语 | 90.0 |
| 4 | NaN | NaN | 小王 | 语文 | 85.0 |
| 6 | NaN | NaN | NaN | 英语 | 90.0 |
| 8 | NaN | NaN | 小刚 | 语文 | 85.0 |
| 9 | NaN | NaN | NaN | 数学 | 80.0 |
| 10 | NaN | NaN | NaN | 英语 | 90.0 |
步骤3: 删除掉全是空值的列
study.dropna(axis=1,how='all',inplace=True)
study
| 姓名 | 科目 | 分数 | |
|---|---|---|---|
| 0 | 小明 | 语文 | 85.0 |
| 1 | NaN | 数学 | 80.0 |
| 2 | NaN | 英语 | 90.0 |
| 3 | NaN | NaN | NaN |
| 4 | 小王 | 语文 | 85.0 |
| 5 | NaN | 数学 | NaN |
| 6 | NaN | 英语 | 90.0 |
| 7 | NaN | NaN | NaN |
| 8 | 小刚 | 语文 | 85.0 |
| 9 | NaN | 数学 | 80.0 |
| 10 | NaN | 英语 | 90.0 |
步骤4:删除掉全是空值的列
study.dropna(axis=0,how='all',inplace=True)
study
| 姓名 | 科目 | 分数 | |
|---|---|---|---|
| 0 | 小明 | 语文 | 85.0 |
| 1 | NaN | 数学 | 80.0 |
| 2 | NaN | 英语 | 90.0 |
| 4 | 小王 | 语文 | 85.0 |
| 5 | NaN | 数学 | NaN |
| 6 | NaN | 英语 | 90.0 |
| 8 | 小刚 | 语文 | 85.0 |
| 9 | NaN | 数学 | 80.0 |
| 10 | NaN | 英语 | 90.0 |
步骤5:将分数列为空的填充为0分
study.fillna({'分数':0},inplace=True)
等同于
study['分数']=study['分数'].fillna(0)
study
| 姓名 | 科目 | 分数 | |
|---|---|---|---|
| 0 | 小明 | 语文 | 85.0 |
| 1 | NaN | 数学 | 80.0 |
| 2 | NaN | 英语 | 90.0 |
| 4 | 小王 | 语文 | 85.0 |
| 5 | NaN | 数学 | 0.0 |
| 6 | NaN | 英语 | 90.0 |
| 8 | 小刚 | 语文 | 85.0 |
| 9 | NaN | 数学 | 80.0 |
| 10 | NaN | 英语 | 90.0 |
步骤6:将姓名的缺失值填充
使用前面的有效填充,用ffill:forward
study.loc[:,'姓名']=study['姓名'].fillna(method='ffill')
study
| 姓名 | 科目 | 分数 | |
|---|---|---|---|
| 0 | 小明 | 语文 | 85.0 |
| 1 | 小明 | 数学 | 80.0 |
| 2 | 小明 | 英语 | 90.0 |
| 4 | 小王 | 语文 | 85.0 |
| 5 | 小王 | 数学 | 0.0 |
| 6 | 小王 | 英语 | 90.0 |
| 8 | 小刚 | 语文 | 85.0 |
| 9 | 小刚 | 数学 | 80.0 |
| 10 | 小刚 | 英语 | 90.0 |
步骤7:将清洗好的excel保存
去掉自动生成索引
保存到文件中
study.to_excel('student_clean.xlsx',index=False)
浙公网安备 33010602011771号