1 处理缺失值
(2) 补全缺失值
有时候我们并不是想要过滤缺失值,而是需要补全数据。大多数情况下,主要使用fillna方法补全缺失值,调用该方法时,可以传入一个常数来替代缺失值。
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(4, 3))
df.iloc[:2, 1] = np.nan
df.iloc[:2, 2] = np.nan
print(round(df, 2)) #保留两位数字
round(df.fillna(0), 2) #缺失值赋值为0,保留两位数字
-----结果-----
df:
0 1 2
0 0.35 NaN NaN
1 -1.18 NaN NaN
2 -1.26 -0.62 -1.28
3 -1.44 0.20 0.55
重新赋值:
0 1 2
0 0.35 0.00 0.00
1 -1.18 0.00 0.00
2 -1.26 -0.62 -1.28
3 -1.44 0.20 0.55
为不同列赋不同的填充值:
round(df.fillna({1: 0.5, 2: 2.0}), 2) #为第二列缺失值赋0.5,第三列赋值为2
-----结果-----
0 1 2
0 0.35 0.50 2.00
1 -1.18 0.50 2.00
2 -1.26 -0.62 -1.28
3 -1.44 0.20 0.55
使用插值方法进行填充:
print(df.fillna(method='bfill')) #后向填充
print(df.fillna(method='bfill', limit=1)) #后向填充且只填充1个
-----结果-----
后向填充:
0 1 2
0 0.347261 -0.622227 -1.277521
1 -1.179992 -0.622227 -1.277521
2 -1.258739 -0.622227 -1.277521
3 -1.442985 0.195110 0.553435
后向填充且只填充1个:
0 1 2
0 0.347261 NaN NaN
1 -1.179992 -0.622227 -1.277521
2 -1.258739 -0.622227 -1.277521
3 -1.442985 0.195110 0.553435
fillna函数参数
函数 | 描述 |
---|---|
value | 标量值或字典类对象用于填充缺失值 |
method | 插值方法,如果没有其他参数,默认为'ffill' |
axis | 需要填充的轴,默认axis=0 |
inplace | 修改被调用的对象,而不是生成一个备份 |
limit | 用于前向或后向填充时最大的填充范围 |
2 数据转换
(1)删除重复值
删除重复值用到了drop_duplicates方法:
df = pd.DataFrame({'k1':['one', 'two']*3+['two'], 'k2':[1, 1, 2, 3, 3, 4, 4]})
print(df.duplicated()) #检查是否每一行存在重复
print(df.drop_duplicates()) #删除duplicated方法中为False的部分
-----结果-----
0 False
1 False
2 False
3 False
4 False
5 False
6 True
删除后:
k1 k2
0 one 1
1 two 1
2 one 2
3 two 3
4 one 3
5 two 4
基于“k1”列删除重复值:
print(df.drop_duplicates(['k1'])) #基于k1列删除重复值
-----结果-----
k1 k2
0 one 1
1 two 1
duplicated和drop_duplicated默认都是保留第一个观测到的值,传入参数last="last"将会返回最后一个:
print(df.drop_duplicates(['k1'], keep = 'last')) #保留最后一个值
-----结果-----
k1 k2
4 one 3
6 two 4
(2)使用函数或映射进行数据转换
对于许多数据集,可能希望基于DataFrame中的数组、列或列中的数值进行一些转换,测试数据(data)如下,包含九类肉的名称和价格:
假设要添加一列用于表明每种食物的动物肉类型,映射如下:
meat_to_animal = {'bacon': 'pig', 'pulled pork': 'pig', 'pastrami': 'cow',
'corned beef': 'cow', 'honey ham': 'pig', 'nova lox': 'salmon'}
Series对象的map方法可以接受一个函数或包含映射关系的字典型对象,但是在data中有一些肉类大写了,我们需要转换成小写。
low_food = data['food'].str.lower() #利用Series的str.lower方法转换成小写
low_food:
0 bacon
1 pulled pork
2 bacon
3 pastrami
4 corned beef
5 bacon
6 pastrami
7 honey ham
8 nova lox
data['animal'] = low_food.map(meat_to_animal) #新增一列animal表示肉类所属哪种动物
data:
food price animal
0 bacon 4.0 pig
1 pulled pork 3.0 pig
2 bacon 12.0 pig
3 Pastrami 6.0 cow
4 corned beef 7.5 cow
5 Bacon 8.0 pig
6 pastrami 3.0 cow
7 honey ham 5.0 pig
8 nova lox 6.0 salmon
以上工作也可以通过一个函数完成:
data['animal'] = data['food'].map(lambda x: meat_to_animal[x.lower()])
data:
结果同上一步
(3)替代值
替代值主要是通过replace函数实现,例如data.replace(-999, 0)表示将data中的-999替换成0;同样的也可以传入列表,例如data.replace([-999, np.nan], 0)表示将-999和缺失值替换为0;data.replace([-999, np.nan], [0, 1])表示将-999替换成0,将缺失值替换为1;也可以传递字典,例如data.replace({-999: 0, np.nan: 1})也表示将-999替换成0,将缺失值替换为1。
今天的内容就介绍到这里,比较重要的内容有补全缺失值和替代值,下一篇将简单介绍重命名轴索引和检测过滤异常值。