安全矩阵

 找回密码
 立即注册
搜索
查看: 2258|回复: 0

手把手教你用pandas处理扫描到的信息数据

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-9-23 20:17:48 | 显示全部楼层 |阅读模式
本帖最后由 Delina 于 2021-9-23 20:31 编辑

原文链接:手把手教你用pandas处理扫描到的信息数据

pandas对象的所有描述性统计信息默认情况下是排除缺失值的。
pandas对象中表现缺失值的方式并不完美,但是它对大部分用户来说是有用的。对于数值型数据,pandas使用浮点值NaN(Not a Number来表示缺失值)。我们称NaN为容易检测到的标识值:
In :
  1. string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])
复制代码

Out:
  1. 0      aardvark1     artichoke2            NaN3       avocadod
复制代码

In:
  1. string_data.isnull()
复制代码
Out:
  1. 0     False1     False2      True3     Falsedtype: bool
复制代码

在pandas中,我们采用了R语言中的编程惯例,将缺失值成为NA,意思是not available(不可用)。在统计学应用中,NA数据可以是不存在的数据或者是存在但不可观察的数据(例如在数据收集过程中出现了问题)。当清洗数据用于分析时,对缺失数据本身进行分析以确定数据收集问题或数据丢失导致的数据偏差通常很重要。
Python内建的None值在对象数组中也被当作NA处理:
In:
  1. string_data[0] = None
  2. string_data.isnull()
复制代码

Out:
  1. 0      True1     False2      True3     Falsedtype: bool
复制代码

pandas项目持续改善处理缺失值的内部细节,但是用户API函数,比如pandas. isnull,抽象掉了很多令人厌烦的细节。处理缺失值的相关函数列表如下:
  •         dropna:根据每个标签的值是否是缺失数据来筛选轴标签,并根据允许丢失的数据量来确定阈值
  •         fillna:用某些值填充缺失的数据或使用插值方法(如“ffill”或“bfill”)。
  •         isnull:返回表明哪些值是缺失值的布尔值
  •         notnull:isnull的反作用函数
01 过滤缺失值
有多种过滤缺失值的方法。虽然你可以使用pandas.isnull和布尔值索引手动地过滤缺失值,但dropna在过滤缺失值时是非常有用的。在Series上使用dropna,它会返回Series中所有的非空数据及其索引值:
In:
  1. from numpy import nan as NA
  2. data = pd.Series([1, NA, 3.5, NA, 7])
  3. data.dropna()
复制代码
Out:
  1. 0     1.02     3.54     7.0dtype: float64
复制代码

上面的例子与下面的代码是等价的:
In:
  1. data[data.notnull()]
复制代码
Out:
  1. 0     1.02     3.54     7.0dtype: float64
复制代码
当处理DataFrame对象时,事情会稍微更复杂一点。你可能想要删除全部为NA或包含有NA的行或列。dropna默认情况下会删除包含缺失值的行:
In:
  1. data = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA]                     [NA, NA, NA], [NA, 6.5, 3.]])
  2. cleaned = data.dropna()
  3. data
复制代码
Out:
  1.   0     1     20  1.0  6.5  3.01  1.0  NaN  NaN2  NaN  NaN  NaN3  NaN  6.5  3.0
复制代码
In:
  1. cleaned
复制代码
Out:
  1.    0     1     20  1.0  6.5  3.0
复制代码
传入how='all’时,将删除所有值均为NA的行:
In:
  1. data.dropna(how='all')
复制代码
Out:
  1.      0    1    20  1.0  6.5  3.01  1.0  NaN  NaN3  NaN  6.5  3.0
复制代码
如果要用同样的方式去删除列,传入参数axis=1:
In:
  1. data[4] = NA
  2. data
复制代码
Out:
  1.      0    1    2   40  1.0  6.5  3.0 NaN1  1.0  NaN  NaN NaN2  NaN  NaN  NaN NaN3  NaN  6.5  3.0 NaN
复制代码
In:
  1. data.dropna(axis=1, how='all')
复制代码
Out:
  1.      0    1    20  1.0  6.5  3.01  1.0  NaN  NaN2  NaN  NaN  NaN3  NaN  6.5  3.0
复制代码
过滤DataFrame的行的相关方法往往涉及时间序列数据。假设你只想保留包含一定数量的观察值的行。你可以用thresh参数来表示:
In:
  1. df = pd.DataFrame(np.random.randn(7, 3))
  2. df.iloc[:4, 1] = NA
  3. df.iloc[:2, 2] = NA
  4. df
复制代码
Out:
  1.           0         1         20 -0.204708       NaN       NaN1 -0.555730       NaN       NaN2  0.092908       NaN  0.7690233  1.246435       NaN -1.2962214  0.274992  0.228913  1.3529175  0.886429 -2.001637 -0.3718436  1.669025 -0.438570 -0.539741
复制代码
In:
  1. df.dropna()
复制代码
Out:
  1.          0         1         24 0.274992  0.228913  1.3529175 0.886429 -2.001637 -0.3718436 1.669025 -0.438570 -0.539741
复制代码
In:
  1. df.dropna(thresh=2)
复制代码
Out:
  1.         0         1         22 0.092908       NaN  0.7690233 1.246435       NaN -1.2962214 0.274992  0.228913  1.3529175 0.886429 -2.001637 -0.3718436 1.669025 -0.438570 -0.539741
复制代码
02 补全缺失值
你有时可能需要以多种方式补全“漏洞”,而不是过滤缺失值(也可能丢弃其他数据)。
大多数情况下,主要使用fillna方法来补全缺失值。调用fillna时,可以使用一个常数来替代缺失值:
In:
  1. df.fillna(0)
复制代码
Out:
  1.           0         1         20 -0.204708  0.000000  0.0000001 -0.555730  0.000000  0.0000002  0.092908  0.000000  0.7690233  1.246435  0.000000 -1.2962214  0.274992  0.228913  1.3529175  0.886429 -2.001637 -0.3718436  1.669025 -0.438570 -0.539741
复制代码
在调用fillna时使用字典,你可以为不同列设定不同的填充值:
In:
  1. df.fillna({1: 0.5, 2: 0})
复制代码
Out:
  1.           0         1         20 -0.204708  0.500000  0.0000001 -0.555730  0.500000  0.0000002  0.092908  0.500000  0.7690233  1.246435  0.500000 -1.2962214  0.274992  0.228913  1.3529175  0.886429 -2.001637 -0.3718436  1.669025 -0.438570 -0.539741
复制代码
fillna返回的是一个新的对象,但你也可以修改已经存在的对象:
In:
  1. _ = df.fillna(0, inplace=True)
  2. df
复制代码
Out:
  1.           0         1         20 -0.204708  0.000000  0.0000001 -0.555730  0.000000  0.0000002  0.092908  0.000000  0.7690233  1.246435  0.000000 -1.2962214  0.274992  0.228913  1.3529175  0.886429 -2.001637 -0.3718436  1.669025 -0.438570 -0.539741
复制代码
用于重建索引的相同的插值方法也可以用于fillna:
In:
  1. df = pd.DataFrame(np.random.randn(6, 3))<img _height="15" src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" alt="" width="15" border="0">
  2. df.iloc[2:, 1] = NA
  3. df.iloc[4:, 2] = NA
  4. df
复制代码
Out:
  1.           0         1         20  0.476985  3.248944 -1.0212281 -0.577087  0.124121  0.3026142  0.523772       NaN  1.3438103 -0.713544       NaN -2.3702324 -1.860761       NaN       NaN5 -1.265934       NaN       NaN
复制代码
In:
  1. df.fillna(method='ffill')
复制代码
Out:
  1.           0         1         20  0.476985  3.248944 -1.0212281 -0.577087  0.124121  0.3026142  0.523772  0.124121  1.3438103 -0.713544  0.124121 -2.3702324 -1.860761  0.124121 -2.3702325 -1.265934  0.124121 -2.370232
复制代码
In:
  1. df.fillna(method='ffill', limit=2)
复制代码
Out:
  1.           0         1         20  0.476985  3.248944 -1.0212281 -0.577087  0.124121  0.3026142  0.523772  0.124121  1.3438103 -0.713544  0.124121 -2.3702324 -1.860761       NaN -2.3702325 -1.265934       NaN -2.370232
复制代码
使用fillna你可以完成很多带有一点创造性的工作。例如,你可以将Series的平均值或中位数用于填充缺失值:
In:
  1. data = pd.Series([1., NA, 3.5, NA, 7])
  2. data.fillna(data.mean())
复制代码
Out:
0     1.0000001     3.8333332     3.5000003     3.8333334     7.000000dtype: float64
以下是fillna的函数参数。
  •         value:标量值或字典型对象用于填充缺失值
  •         method:插值方法,如果没有其他参数,默认是'ffill'
  •         axis:需要填充的轴,默认axis=0
  •         inplace:修改被调用的对象,而不是生成一个备份
  •         limit:用于前向或后向填充时最大的填充范围


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-19 07:48 , Processed in 0.019608 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表