《利用python进行数据分析.第三版》 第七章 数据清洗和准备

7.1 处理缺失数据

缺失数据在pandas中呈现的方式有些不完美,但对于大多数用户可以保证功能正常。对于数值数据,pandas使用浮点值NaN(Not a Number)表示缺失数据。我们称其为哨兵值,可以方便的检测出来。
处理缺失数据有以下几个方法:
这里写图片描述

  1. 判断是否为缺失数据,布尔类型
    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

利用函数或映射进行数据转换

扫描二维码关注公众号,回复: 3572391 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_42787271/article/details/82702531