7.1 处理缺失数据
缺失数据在pandas中呈现的方式有些不完美,但对于大多数用户可以保证功能正常。对于数值数据,pandas使用浮点值NaN(Not a Number)表示缺失数据。我们称其为哨兵值,可以方便的检测出来。
处理缺失数据有以下几个方法:
pd.isnull
pd.notnull
举例说明:
import pandas as pd
import numpy as np
data=pd.Series(["liming",'xiaohong',np.nan,"xiaoshu"])
print(data)
data[3]=None
print(data)
data1=data.isnull()
print(data1)
answer:
0 liming
1 xiaohong
2 NaN
3 xiaoshu
dtype: object
0 liming
1 xiaohong
2 NaN
3 None
dtype: object
0 False
1 False
2 True
3 True
dtype: bool
滤除缺失数据
pd.dropna([axis=0/1],[how="all"])#括号里面是选填条件,默认是0
举例说明:
1、Series一维数组的滤除缺失数据
data2=data.dropna()
print(data2)
0 liming
1 xiaohong
3 xiaoshu
dtype: object
2、DataFrame二维数组滤除缺失数据
data3=pd.DataFrame([
[1., 6.5, 3.], [1., np.nan, np.nan],
[np.nan, np.nan,np.nan], [np.nan, 6.5, 3.]
])
print(data3)
#默认axis=0,滤除只要含有缺失值的数据的行
data4=data3.dropna()
print(data4)
#默认axis=0,滤除行所有的数值都为缺失值的行
data5=data3.dropna(how="all")
print(data5)
answer:
data3
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
2 NaN NaN NaN
3 NaN 6.5 3.0
data4
0 1 2
0 1.0 6.5 3.0
data5
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
3 NaN 6.5 3.0
#添加新的一列,定位axis=1的数据
data3[4]=np.nan
print(data3)
data7=data6.dropna(axis=1)
print(data7)
3、另一个滤除DataFrame行的问题涉及时间序列数据。假设你只想留下一部分观测数据,可以用thresh参数实现此目的:
data8=pd.DataFrame(np.random.randn(7,3))
data8.iloc[:4,1]=np.nan
data8.iloc[:3,2]=np.nan
print(data8)
print(data8.dropna(thresh=2))#滤除含有两个的空值
answer:
0 1 2
0 1.720139 NaN NaN
1 1.480859 NaN NaN
2 1.469710 NaN NaN
3 0.065648 NaN 1.950179
4 0.521906 0.423313 0.575727
5 -0.185384 0.543688 0.092195
6 -1.478984 -0.280495 0.739243
滤除含有2个空值的数据
0 1 2
3 0.065648 NaN 1.950179
4 0.521906 0.423313 0.575727
5 -0.185384 0.543688 0.092195
6 -1.478984 -0.280495 0.739243
填充数据
data8=pd.DataFrame(np.random.randn(7,3))
data8.iloc[:4,1]=np.nan
data8.iloc[:2,2]=np.nan
#填充数据0
data9=data8.fillna(0)#fillna默认会返回新对象
#print(data8)
print(data9)
#通过一个字典调用fillna,就可以实现对不同的列填充不同的值:
data10=data8.fillna({1:0.5,2:0})
print(data10)
answer:
0 1 2
0 -0.171332 0.000000 0.000000
1 -0.150760 0.000000 0.000000
2 -0.286562 0.000000 0.347290
3 0.464620 0.000000 1.755258
4 1.131274 -0.161065 0.131859
5 -1.649791 0.672376 1.216424
6 1.735930 0.420943 1.562621
0 1 2
0 -0.171332 0.500000 0.000000
1 -0.150760 0.500000 0.000000
2 -0.286562 0.500000 0.347290
3 0.464620 0.500000 1.755258
4 1.131274 -0.161065 0.131859
5 -1.649791 0.672376 1.216424
6 1.735930 0.420943 1.562621
#对填充的对象进行就地修改,因为之前说过填充后会默认形成一个新的对象,所以可以选择就地填充inplace=True
_ = df.fillna(0, inplace=True)
#向前填充
df.fillna(method='ffill')
#向前填充,并且限制只能向前填充两个
df.fillna(method='ffill', limit=2)
#填充一组数据的平均数
data.fillna(data.mean())
7.2 数据转换
本章到目前为止介绍的都是数据的重排。另一类重要操作则是过滤、清理以及其他的转换工作。
语法规则
data4.drop_duplicates(self,subset=None,keep=”fist”,inplace=False)
self:列表定义根据哪一列或者几列去重
keep:duplicated和drop_duplicates默认保留的是第一个出现的值组合。传入keep=’last’则保留最后一个:
inplace:默认是生成新的一个数组,如果就地修改就True
import pandas as pd
data1=pd.DataFrame({"k1":["one",'two']*3+["two"],"k2":[1,1,2,3,3,4,4]})
# print(data1)
data2=data1.duplicated()
print(data1)
print(data2)
data3=data1.drop_duplicates()
print(data3)
data1["k3"]=range(7)
data4=data1.drop_duplicates(["k1"])
print(data4)
data5=data1.drop_duplicates(["k1","k2"],keep="last")
print(data5)
answer:
data1
k1 k2
0 one 1
1 two 1
2 one 2
3 two 3
4 one 3
5 two 4
6 two 4
data2
0 False
1 False
2 False
3 False
4 False
5 False
6 True
dtype: bool
data3
k1 k2
0 one 1
1 two 1
2 one 2
3 two 3
4 one 3
5 two 4
data4
k1 k2 k3
0 one 1 0
1 two 1 1
data5
k1 k2 k3
0 one 1 0
1 two 1 1
2 one 2 2
3 two 3 3
4 one 3 4
6 two 4 6
利用函数或映射进行数据转换