暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python数据分析笔记#7.2.6 检测和过滤异常值

Yuan的学习笔记 2022-01-10
805



「目录」

数据清洗和准备

Data Cleaning and Prepration

  • 7.1 => 处理缺失数据

  • 7.2 => 数据转换

    --------> 移除重复数据

    --------> 利⽤函数或映射进行数据转换

    --------> 替换值

    --------> 重命名轴索引

    --------> 离散化和面元划分

    --------> 检测和过滤异常值

  • 7.3 => 字符串操作

检测和过滤异常值

嗯,距离上一次更新笔记还是去年...,今天再往下面章节推进一点吧。

过滤或变换异常值在很大程度上就是运用数组运算。

前排提示本篇笔记主要讲了describe方法,any方法和np.sign方法

来看一个DataFrame,这里用np.random.randn生成了正态分布的数据:

In [1]: import numpy as np

In [2]: import pandas as pd

In [3]: data = pd.DataFrame(np.random.randn(1000, 4))

复制

describe()方法会统计DataFrame中每一个column里的count数量,mean平均值,std标准差,std标准差,max最大值,百分位值。

In [4]: data.describe()
Out[4]:
                 0            1            2            3
count  1000.000000  1000.000000  1000.000000  1000.000000
mean      0.007525    -0.008104     0.032856     0.018571
std       1.053115     1.016978     0.989279     1.022208
min      -3.642000    -3.337398    -3.221536    -3.129636
25%      -0.713827    -0.684061    -0.642646    -0.689392
50%       0.020200     0.096489     0.018625     0.045681
75%       0.725778     0.690407     0.708214     0.699719
max       3.641040     2.943599     3.106397     3.504886

复制

假设我们想要找出绝对值大小大于3的值:


In [5]: col = data[2]

In [6]: col[np.abs(col)>3]
Out[6]:
383   -3.221536
465    3.106397
630    3.075631
Name: 2, dtype: float64

复制

要选出全部含有大于3或小于-3的值的行,可以在布尔型DataFrame中使用any方法

In [7]: data[(np.abs(data)>3).any(1)]
Out[7]:
            0         1         2         3
10   3.115197 -0.429293 -1.488574 -1.248832
41  -3.236021  0.846668 -0.462576 -0.770415
60  -1.245012  1.518076 -1.292043  3.219340
195 -3.111161 -0.341791  0.797307  0.090476
239 -3.140475 -0.392564 -0.491919  0.917431
372  3.641040 -1.095120  0.714931 -1.225775
383  1.164054 -2.047523 -3.221536 -0.548215
458 -3.642000  1.566959  0.385317  0.637622
465  0.198955 -1.031466  3.106397 -1.072903
514 -0.784815  1.952474  0.635436  3.504886
537 -0.799796 -3.337398  0.858902 -0.433413
630  0.226837 -0.328830  3.075631  2.471823
672  0.094143  0.131909 -0.359841  3.003043
742 -0.378700  0.817330 -1.227877 -3.129636
771 -0.957550 -3.304534 -1.150420  1.925189
828 -3.057687  0.248392 -0.112263 -0.265542
883 -2.000208  0.728119 -0.304764  3.152761

复制

any方法和all方法是相反的,any只要存在不为0就是True,all方法只有都不为0才为True。

In [11]: np.array([1, 0, 2, 3]).any()
Out[11]: True

In [12]: np.array([1, 0, 2, 3]).all()
Out[12]: False

复制

然后我们看一下any(1)和any(0)有什么区别,any()里的0或1对应axis轴的方向,看下面的例子吧,应该一看就明白了。

In [13]: sample = pd.DataFrame([[0,1,2,3],[-2,-1,0,1],[3,4,5,6]])

In [14]: sample
Out[14]:
   0  1  2  3
0  0  1  2  3
1 -2 -1  0  1
2  3  4  5  6

In [15]: sample.any(0)
Out[15]:
0    True
1    True
2    True
3    True
dtype: bool

In [16]: sample.any(1)
Out[16]:
0    True
1    True
2    True
dtype: bool

复制

根据数据的值是正的还是负的np.sign()可以生成1和-1。

In [10]: np.sign(data).head()
Out[10]:
     0    1    2    3
0 -1.0  1.0 -1.0 -1.0
1 -1.0  1.0  1.0  1.0
2  1.0 -1.0  1.0  1.0
3 -1.0  1.0 -1.0 -1.0
4  1.0 -1.0 -1.0 -1.0

复制

下面的代码可以把值限定在-3到3之间,看统计信息里的min和max值哦:

In [8]: data[np.abs(data)>3] = np.sign(data) * 3

In [9]: data.describe()
Out[9]:
                 0            1            2            3
count  1000.000000  1000.000000  1000.000000  1000.000000
mean      0.007956    -0.007462     0.032896     0.017820
std       1.047111     1.014984     0.988019     1.019082
min      -3.000000    -3.000000    -3.000000    -3.000000
25%      -0.713827    -0.684061    -0.642646    -0.689392
50%       0.020200     0.096489     0.018625     0.045681
75%       0.725778     0.690407     0.708214     0.699719
max       3.000000     2.943599     3.000000     3.000000

复制

这篇好短,下一篇笔记是排列和随机采样。BYE-BYE。大家新年快乐!






往期回顾


离散化和面元划分




Stay hungry, stay foolish


文章转载自Yuan的学习笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论