首页Python【Python数据分析】3...

【Python数据分析】31.数据清洗与准备——处理缺失值


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Data_Analysis/lab/index.html
链接: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,2None,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
2.填充缺失值:

与其过滤掉丢失的数据(并可能丢弃其他数据),你可能希望以多种方式填补“漏洞”。对于大多数情况,主要使用 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


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments