有些excel文件不标准,比如空行、有些单元格没有值等,这类情况我们称为缺失值。对于缺失值,我们往往会做三步走的处理,1检测缺失值,2丢弃一些缺失值,3填充一些缺失值
1、isnull和notnull
检测是否为空,适用于
# -*- coding: utf-8 -*-
import pandas as pd
df = pd.read_excel('test.xlsx')
print(df)
print('------------------')
print(df.loc[df['分数'].notnull()])
Unnamed: 0 姓名 科目 分数 性别
0 NaN 小王 数学 87.0 NaN
1 NaN 小王 语文 NaN NaN
2 NaN NaN 英语 89.0 NaN
3 NaN 小张 数学 95.0 NaN
4 NaN NaN NaN NaN NaN
5 NaN 小张 语文 96.0 NaN
6 NaN 小张 英语 97.0 NaN
7 NaN NaN 数学 50.0 NaN
8 NaN 小龙 语文 51.0 NaN
9 NaN 小龙 英语 52.0 NaN
------------------
Unnamed: 0 姓名 科目 分数 性别
0 NaN 小王 数学 87.0 NaN
2 NaN NaN 英语 89.0 NaN
3 NaN 小张 数学 95.0 NaN
5 NaN 小张 语文 96.0 NaN
6 NaN 小张 英语 97.0 NaN
7 NaN NaN 数学 50.0 NaN
8 NaN 小龙 语文 51.0 NaN
9 NaN 小龙 英语 52.0 NaN
2、dropna 删除缺失值,主要了解3个参数
axis:0 or ‘index’, 1 or ‘columns’
how:any有一个缺失值就drop that row or column,‘all’ 所有值是缺失值才drop that row or column.
inpalce:bool, default False
# -*- coding: utf-8 -*-
import pandas as pd
df = pd.read_excel('test.xlsx')
print(df)
print('------------------')
# 删除空列
df.dropna(axis=1,how='all',inplace=True)
print(df)
print('------------------')
# 删除空行
df.dropna(axis=0,how='all',inplace=True)
print(df)
Unnamed: 0 姓名 科目 分数 性别
0 NaN 小王 数学 87.0 NaN
1 NaN 小王 语文 NaN NaN
2 NaN NaN 英语 89.0 NaN
3 NaN 小张 数学 95.0 NaN
4 NaN NaN NaN NaN NaN
5 NaN 小张 语文 96.0 NaN
6 NaN 小张 英语 97.0 NaN
7 NaN NaN 数学 50.0 NaN
8 NaN 小龙 语文 51.0 NaN
9 NaN 小龙 英语 52.0 NaN
------------------
姓名 科目 分数
0 小王 数学 87.0
1 小王 语文 NaN
2 NaN 英语 89.0
3 小张 数学 95.0
4 NaN NaN NaN
5 小张 语文 96.0
6 小张 英语 97.0
7 NaN 数学 50.0
8 小龙 语文 51.0
9 小龙 英语 52.0
------------------
姓名 科目 分数
0 小王 数学 87.0
1 小王 语文 NaN
2 NaN 英语 89.0
3 小张 数学 95.0
5 小张 语文 96.0
6 小张 英语 97.0
7 NaN 数学 50.0
8 小龙 语文 51.0
9 小龙 英语 52.0
3、fillna 填充缺失值,主要了解2个参数
value:填充的值,可以是单个值,可以是字典(key为列名,value是值)
method:等于ffill则使用前一个不为空的值填充,等于bfill使用后一个不为空的值填充
# -*- coding: utf-8 -*-
import pandas as pd
df = pd.read_excel('test.xlsx')
print(df)
print('------------------')
df.loc[:,'分数'] = df['分数'].fillna(100)
"""
等价于df.fillna({'分数':100})
"""
print(df)
Unnamed: 0 姓名 科目 分数 性别
0 NaN 小王 数学 87.0 NaN
1 NaN 小王 语文 NaN NaN
2 NaN NaN 英语 89.0 NaN
3 NaN 小张 数学 95.0 NaN
4 NaN NaN NaN NaN NaN
5 NaN 小张 语文 96.0 NaN
6 NaN 小张 英语 97.0 NaN
7 NaN NaN 数学 50.0 NaN
8 NaN 小龙 语文 51.0 NaN
9 NaN 小龙 英语 52.0 NaN
------------------
Unnamed: 0 姓名 科目 分数 性别
0 NaN 小王 数学 87.0 NaN
1 NaN 小王 语文 100.0 NaN
2 NaN NaN 英语 89.0 NaN
3 NaN 小张 数学 95.0 NaN
4 NaN NaN NaN 100.0 NaN
5 NaN 小张 语文 96.0 NaN
6 NaN 小张 英语 97.0 NaN
7 NaN NaN 数学 50.0 NaN
8 NaN 小龙 语文 51.0 NaN
9 NaN 小龙 英语 52.0 NaN
# -*- coding: utf-8 -*-
import pandas as pd
df = pd.read_excel('test.xlsx')
print(df)
print('------------------')
# index索引0到6用上面单元格的值填充
df.loc[0:6,'姓名'] = df['姓名'].fillna(method='ffill')
# index索引7到最后用下面单元格的值填充
df.loc[7:,'姓名'] = df['姓名'].fillna(method='bfill')
# 缺失的分数设为100
df.loc[:,'分数'] = df['分数'].fillna(100)
"""
等价于df.fillna({'分数':100})
"""
print(df)
Unnamed: 0 姓名 科目 分数 性别
0 NaN 小王 数学 87.0 NaN
1 NaN 小王 语文 NaN NaN
2 NaN NaN 英语 89.0 NaN
3 NaN 小张 数学 95.0 NaN
4 NaN NaN NaN NaN NaN
5 NaN 小张 语文 96.0 NaN
6 NaN 小张 英语 97.0 NaN
7 NaN NaN 数学 50.0 NaN
8 NaN 小龙 语文 51.0 NaN
9 NaN 小龙 英语 52.0 NaN
------------------
Unnamed: 0 姓名 科目 分数 性别
0 NaN 小王 数学 87.0 NaN
1 NaN 小王 语文 100.0 NaN
2 NaN 小王 英语 89.0 NaN
3 NaN 小张 数学 95.0 NaN
4 NaN 小张 NaN 100.0 NaN
5 NaN 小张 语文 96.0 NaN
6 NaN 小张 英语 97.0 NaN
7 NaN 小龙 数学 50.0 NaN
8 NaN 小龙 语文 51.0 NaN
9 NaN 小龙 英语 52.0 NaN