准备数据
有空行,空列的数据

Pandas对缺失值的处理
Pandas使用这些函数处理缺失值
- isnull 和 notnull:检测是否是空值,可用于df和series
- dropna:丢弃,删除缺失值
- axis:删除行还是列,{0 or 'index', 1 or 'columns'}, default 0
- how:如果等于any则任何值为空都删除,如果等于all则所有值都为空才删除
- inplace:如果为True则修改当前df,否则返回新的df
- fillna:填充空值
- value:用于填充的值,可以是单个值,或者字典(key是列名,value是值)
- method:等于ffill使用前一个不为空的值填充forward fill; 等于bfill使用后一个不为空的值填充backword fill
- axis:按行还是列填充,{0 or 'index', 1 or 'columns'}
- inplace:如果为True则修改当前df,否则返回新的df
例子:特殊Excel的读取,清洗,处理
1. 读取excel的时候,忽略前几个空行
import pandas as pd file_path = r'C:\TELCEL_MEXICO_BOT\A\student.xlsx' studf = pd.read_excel(file_path,skiprows=2) 注意:skiprow=2表示读取时先略过前两行,因为excel中的前两行是空的,然后会从第三行开始读取 print(studf) Unnamed: 0 姓名 科目 分数 0 NaN 小明 语文 85.0 1 NaN NaN 数学 80.0 2 NaN NaN 英语 90.0 3 NaN NaN NaN NaN 4 NaN 小王 语文 85.0 5 NaN NaN 数学 NaN 6 NaN NaN 英语 90.0 7 NaN NaN NaN NaN 8 NaN 小刚 语文 85.0 9 NaN NaN 数学 80.0 10 NaN NaN 英语 90.0
2. 检查空值
print(studf.isnull()) Unnamed: 0 姓名 科目 分数 0 True False False False 1 True True False False 2 True True False False 3 True True True True 4 True False False False 5 True True False True 6 True True False False 7 True True True True 8 True False False False 9 True True False False 10 True True False False
print(studf['分数'].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
print(studf['分数'].notnull()) 0 True 1 True 2 True 3 False 4 True 5 False 6 True 7 False 8 True 9 True 10 True Name: 分数, dtype: bool
- 筛选没有空分数的所有行
print(studf.loc[studf['分数'].notnull()]) Unnamed: 0 姓名 科目 分数 0 NaN 小明 语文 85.0 1 NaN NaN 数学 80.0 2 NaN NaN 英语 90.0 4 NaN 小王 语文 85.0 6 NaN NaN 英语 90.0 8 NaN 小刚 语文 85.0 9 NaN NaN 数学 80.0 10 NaN NaN 英语 90.0
3. 删除全是空值的列
# axis='columns' 按列进行删除 # how='all' 如果这一列所有字段全是空值,就将这列删除 # inplace=True 直接修改这个df, 本例中直接修改studf studf.dropna(axis='columns', how='all', inplace=True) print(studf) 姓名 科目 分数 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. 删除全是空值的行
studf.dropna(axis='index', how='all', inplace=True) print(studf) 姓名 科目 分数 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分
a = studf.fillna({'分数':0})
print(a)
姓名 科目 分数
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. 将姓名的缺失值进行填充
# 姓名列中为空的替换为指定字符串 未知,
# 分数列中为空的替换为 0
df_filled = studf.fillna({'姓名': '未知', '科目': '未知', '分数': 0})
print(df_filled)
姓名 科目 分数
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
使用前面的有效值填充,用ffill:forward fill
studf['姓名'] = studf['姓名'].fillna(method='ffill')
studf = studf.fillna({'分数':0})
print(studf)
姓名 科目 分数
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保存
studf.to_excel(r'C:\TELCEL_MEXICO_BOT\A\student_Clean.xlsx', index=False)

495

被折叠的 条评论
为什么被折叠?



