异常值检测和过滤
如何过滤?
-
使用describe()函数查看每一列的描述性统计量
-
使用std()函数可以求得DataFrame对象每一列的标准差
-
根据每一列的标准差,对DataFrame元素进行过滤。
借助any()函数, 测试是否有True,有一个或以上返回True,反之返回False
对每一列应用筛选条件,去除标准差太大的数据
-
删除特定索引df.drop(labels,inplace = True)
异常值的检测和过滤思路:
- 定义异常值的判断标准. 绝对值大于三倍标准偏差
- 把判断标准写成条件写法. (df.abs() > 3 * df.std()).any(axis=1)
- 使用条件去过滤 df.loc[~cond]
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
df = DataFrame(data=np.random.randn(10000, 3))
df.loc[0, 2] = 10
df
| 0 | 1 | 2 |
---|
0 | -0.386862 | 1.247203 | 10.000000 |
---|
1 | 1.099927 | 0.458637 | -0.125444 |
---|
2 | -0.904580 | -1.418073 | 0.680194 |
---|
3 | 1.487018 | 1.306848 | 1.107998 |
---|
4 | -0.698016 | 2.273252 | 1.173093 |
---|
... | ... | ... | ... |
---|
9995 | -0.417892 | 1.233352 | -1.299887 |
---|
9996 | -0.019062 | -1.343137 | 1.003187 |
---|
9997 | 1.772394 | 0.510613 | -1.499494 |
---|
9998 | 1.397129 | -0.038462 | 0.306495 |
---|
9999 | -0.073154 | -0.634456 | -1.786302 |
---|
10000 rows × 3 columns
df.describe()
| 0 | 1 | 2 |
---|
count | 10000.000000 | 10000.000000 | 10000.000000 |
---|
mean | 0.006042 | -0.001334 | 0.001778 |
---|
std | 1.005252 | 0.997237 | 1.002157 |
---|
min | -3.752329 | -3.556381 | -4.080823 |
---|
25% | -0.667472 | -0.666099 | -0.666631 |
---|
50% | 0.001345 | 0.003790 | -0.008800 |
---|
75% | 0.683667 | 0.676916 | 0.676586 |
---|
max | 3.693643 | 3.719759 | 10.000000 |
---|
cond = (df.abs() > 3 * df.std()).any(axis=1)
cond
"""
0 True
1 False
2 False
3 False
4 False
...
9995 False
9996 False
9997 False
9998 False
9999 False
Length: 10000, dtype: bool
"""
df.loc[~cond]
| 0 | 1 | 2 |
---|
1 | 1.099927 | 0.458637 | -0.125444 |
---|
2 | -0.904580 | -1.418073 | 0.680194 |
---|
3 | 1.487018 | 1.306848 | 1.107998 |
---|
4 | -0.698016 | 2.273252 | 1.173093 |
---|
5 | 0.034484 | 0.596319 | 0.846428 |
---|
... | ... | ... | ... |
---|
9995 | -0.417892 | 1.233352 | -1.299887 |
---|
9996 | -0.019062 | -1.343137 | 1.003187 |
---|
9997 | 1.772394 | 0.510613 | -1.499494 |
---|
9998 | 1.397129 | -0.038462 | 0.306495 |
---|
9999 | -0.073154 | -0.634456 | -1.786302 |
---|
9918 rows × 3 columns
抽样
抽样有两种: 有放回抽样和无放回抽样
- 有放回的抽样, 结果可能会出现重复的
- 无放回回抽, 结果不会出现重复的样本.
index = ['悟空', '悟饭', '悟天', '武神']
columns = ['语文', '数学', '英语']
data = np.random.randint(0, 150, size=(4, 3))
df = DataFrame(index=index, columns=columns, data=data)
df
| 语文 | 数学 | 英语 |
---|
悟空 | 10 | 45 | 95 |
---|
悟饭 | 87 | 28 | 33 |
---|
悟天 | 105 | 132 | 113 |
---|
武神 | 124 | 89 | 113 |
---|
array = np.random.randint(0, 4, size=(4, ))
array
df.take(array)
| 语文 | 数学 | 英语 |
---|
悟空 | 10 | 45 | 95 |
---|
悟天 | 105 | 132 | 113 |
---|
武神 | 124 | 89 | 113 |
---|
悟天 | 105 | 132 | 113 |
---|
arr = np.random.permutation([0, 1, 2, 3])
arr
df.take(arr)
| 语文 | 数学 | 英语 |
---|
悟空 | 10 | 45 | 95 |
---|
悟饭 | 87 | 28 | 33 |
---|
武神 | 124 | 89 | 113 |
---|
悟天 | 105 | 132 | 113 |
---|
数据聚合
df = DataFrame({'color':['red','white','red','cyan','cyan','green','white','cyan'],
'price':np.random.randint(0,8,size = 8),
'weight':np.random.randint(50,55,size = 8)})
df
| color | price | weight |
---|
0 | red | 3 | 53 |
---|
1 | white | 1 | 54 |
---|
2 | red | 0 | 51 |
---|
3 | cyan | 7 | 52 |
---|
4 | cyan | 6 | 51 |
---|
5 | green | 2 | 54 |
---|
6 | white | 6 | 54 |
---|
7 | cyan | 6 | 51 |
---|
group_obj = df.groupby(by='color')
group_obj
group_obj.groups
group_obj.mean()[['price']]
| price |
---|
color | |
---|
cyan | 6.333333 |
---|
green | 2.000000 |
---|
red | 1.500000 |
---|
white | 3.500000 |
---|
price_mean = group_obj[['price']].mean()
price_mean
| price |
---|
color | |
---|
cyan | 6.333333 |
---|
green | 2.000000 |
---|
red | 1.500000 |
---|
white | 3.500000 |
---|
pd.merge(df, price_mean, left_on='color', right_index=True, suffixes=['', '_mean'])
| color | price | weight | price_mean |
---|
0 | red | 3 | 53 | 1.500000 |
---|
2 | red | 0 | 51 | 1.500000 |
---|
1 | white | 1 | 54 | 3.500000 |
---|
6 | white | 6 | 54 | 3.500000 |
---|
3 | cyan | 7 | 52 | 6.333333 |
---|
4 | cyan | 6 | 51 | 6.333333 |
---|
7 | cyan | 6 | 51 | 6.333333 |
---|
5 | green | 2 | 54 | 2.000000 |
---|