本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):
https://returu.github.io/Python_Data_Analysis/lab/index.html
-
也可以通过百度网盘获取,需要在本地配置代码运行环境,环境配置可以查看【Python基础】2.搭建Python开发环境:
链接:https://pan.baidu.com/s/1MYkeYeVAIRqbxezQECHwcA?pwd=mnsj
提取码:mnsj
-
前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Data_Analysis
根据《Python for Data Analysis 3rd Edition》翻译整理
—————————————————–
缺失数据在许多数据分析应用中很常见。Pandas 的目标之一是尽可能轻松地处理缺失数据。例如,所有关于 Pandas 对象的描述性统计都默认排除缺失数据。
Pandas 对象中的表示缺失数据的方式有些不完美,但对于大多数现实世界的使用来说已经足够了。对于 float64 dtype 的数据,Pandas 使用浮点值 NaN(非数字)来表示缺失数据。
内置的 Python None 值也被视为 NA。
1>>> data = pd.Series([1, np.nan,2, None,3], dtype='float64')
2>>> data
30 1.0
41 NaN
52 2.0
63 NaN
74 3.0
8dtype: float64
9
10>>> data.isna()
110 False
121 True
132 False
143 True
154 False
16dtype: bool
17
18
19>>> data = pd.Series(["a", np.nan,"b", None, "c"])
20>>> data
210 a
221 NaN
232 b
243 None
254 c
26dtype: object
27
28>>> data.isna()
290 False
301 True
312 False
323 True
334 False
34dtype: bool
缺失值处理相关方法如下所示:
方法 |
说明 |
dropna | 根据每个标签的值是否是确实数据来筛选轴标签,并根据允许丢失的数据量来确定阈值(默认返回新对象并且不修改原始对象的内容) |
fillna | 使用某些值或插值方法("ffill" or "bfill" )来填充缺失数据 |
isna | 返回指示哪些值是缺失值的布尔值 |
notna | isna的反函数 |
1.过滤缺失值:
1.1 Series对象:
在Series上可以选择使用 pandas.isna 和布尔索引手动执行此操作,也可使用dropna 。
Series上使用dropna()方法,返回数据中所有的非空数据及其索引值。使用dropna()和使用布尔型数据过滤操作的结果是等价的。
1>>> obj = pd.Series([1,np.nan,3,np.nan,5])
2>>> obj
30 1.0
41 NaN
52 3.0
63 NaN
74 5.0
8dtype: float64
9
10# dropna()方法
11>>> obj.dropna()
120 1.0
132 3.0
144 5.0
15dtype: float64
16
17# 布尔值索引过滤
18>>> obj[obj.notna()]
190 1.0
202 3.0
214 5.0
22dtype: float64
1.2 DataFrame对象:
在DataFrame中dropna方法默认删除所有包含缺失值的行。
1>>> df = pd.DataFrame([[1,5,9],[2,np.nan,np.nan],[np.nan,np.nan,np.nan],[np.nan,8,2]],columns=["a","b","c"])
2>>> df
3 a b c
40 1.0 5.0 9.0
51 2.0 NaN NaN
62 NaN NaN NaN
73 NaN 8.0 2.0
8
9>>> df.dropna()
10 a b c
110 1.0 5.0 9.0
当传入 how="all"
时,只删除所有值均为NaN的行。
1>>> df.dropna(how="all")
2 a b c
30 1.0 5.0 9.0
41 2.0 NaN NaN
53 NaN 8.0 2.0
另外使用thresh参数(thresh为非NaN值的最少个数)可以保留包含一定数量的观察值的行。
1>>> df.dropna(thresh=2)
2 a b c
30 1.0 5.0 9.0
43 NaN 8.0 2.0
要删除列的话就需要指定轴axis=”columns”。
1>>> df = pd.DataFrame([[1,5,9,np.nan],[2,np.nan,7,np.nan],[np.nan,np.nan,np.nan,np.nan],[np.nan,8,2,np.nan]],columns=["a","b","c","d"])
2>>> df
3 a b c d
40 1.0 5.0 9.0 NaN
51 2.0 NaN 7.0 NaN
62 NaN NaN NaN NaN
73 NaN 8.0 2.0 NaN
8
9>>> df.dropna(axis=1,how="all",thresh=3)
10 c
110 9.0
121 7.0
132 NaN
143 2.0
与其过滤掉丢失的数据(并可能丢弃其他数据),你可能希望以多种方式填补“漏洞”。对于大多数情况,主要使用 fillna 方法来补全缺失值。
fillna
函数参数如下所示:
参数 |
说明 |
value | 用于填充缺失值的标量值或类似字典的对象 |
method | 插值方式:“bfill”(向后填充)或“ffill”(向前填充)中的一种;默认为无 |
axis | 要填充的轴("index" or "columns" ),默认为axis=”index” |
limit | 对于正向和反向填充,要填充的最大范围 |
调用 fillna
可以使一个常量值替换缺失值。
1>>> df = pd.DataFrame(np.arange(18).reshape(6,3),columns=["a","b","c"],dtype="float64")
2>>> df.iloc[:3,1] = np.nan
3>>> df.iloc[-3:,2] = np.nan
4>>> df
5 a b c
60 0.0 NaN 2.0
71 3.0 NaN 5.0
82 6.0 NaN 8.0
93 9.0 10.0 NaN
104 12.0 13.0 NaN
115 15.0 16.0 NaN
12
13>>> df.fillna(99)
14 a b c
150 0.0 99.0 2.0
161 3.0 99.0 5.0
172 6.0 99.0 8.0
183 9.0 10.0 99.0
194 12.0 13.0 99.0
205 15.0 16.0 99.0
使用字典调用fillna,可以为每一列使用不同的填充值。
1>>> df.fillna({"b":99 , "c":999})
2 a b c
30 0.0 99.0 2.0
41 3.0 99.0 5.0
52 6.0 99.0 8.0
63 9.0 10.0 999.0
74 12.0 13.0 999.0
85 15.0 16.0 999.0
用于重建索引的插值方法(ffill当前值向前填充,bfill向后填充)也适用于fillna。
1>>> df.fillna(method="bfill")
2 a b c
30 0.0 10.0 2.0
41 3.0 10.0 5.0
52 6.0 10.0 8.0
63 9.0 10.0 NaN
74 12.0 13.0 NaN
85 15.0 16.0 NaN
9
10>>> df.fillna(method="ffill",limit=2)
11 a b c
120 0.0 NaN 2.0
131 3.0 NaN 5.0
142 6.0 NaN 8.0
153 9.0 10.0 8.0
164 12.0 13.0 8.0
175 15.0 16.0 NaN
1>>> df.fillna(df.mean())
2 a b c
30 0.0 13.0 2.0
41 3.0 13.0 5.0
52 6.0 13.0 8.0
63 9.0 10.0 5.0
74 12.0 13.0 5.0
85 15.0 16.0 5.0
本篇文章来源于微信公众号: 码农设计师