Pandas 数据处理指南:异常值、抽样和数据聚合

异常值检测和过滤

如何过滤?

  1. 使用describe()函数查看每一列的描述性统计量

  2. 使用std()函数可以求得DataFrame对象每一列的标准差

  3. 根据每一列的标准差,对DataFrame元素进行过滤。
    借助any()函数, 测试是否有True,有一个或以上返回True,反之返回False
    对每一列应用筛选条件,去除标准差太大的数据

  4. 删除特定索引df.drop(labels,inplace = True)

异常值的检测和过滤思路:

  1. 定义异常值的判断标准. 绝对值大于三倍标准偏差
  2. 把判断标准写成条件写法. (df.abs() > 3 * df.std()).any(axis=1)
  3. 使用条件去过滤 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
012
0-0.3868621.24720310.000000
11.0999270.458637-0.125444
2-0.904580-1.4180730.680194
31.4870181.3068481.107998
4-0.6980162.2732521.173093
............
9995-0.4178921.233352-1.299887
9996-0.019062-1.3431371.003187
99971.7723940.510613-1.499494
99981.397129-0.0384620.306495
9999-0.073154-0.634456-1.786302

10000 rows × 3 columns

# describe函数查看每一列的描述性统计量
df.describe()
012
count10000.00000010000.00000010000.000000
mean0.006042-0.0013340.001778
std1.0052520.9972371.002157
min-3.752329-3.556381-4.080823
25%-0.667472-0.666099-0.666631
50%0.0013450.003790-0.008800
75%0.6836670.6769160.676586
max3.6936433.71975910.000000

# 1. 定义异常值的判断标准.  绝对值大于三倍标准偏差
# 2. 把判断标准写成条件写法. (df.abs() > 3 * df.std()).any(axis=1)
cond = (df.abs() > 3 * df.std()).any(axis=1) # axis=1;检查每一行是否有任何元素为 True
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
"""

# 过滤了为True的行数据
df.loc[~cond]
012
11.0999270.458637-0.125444
2-0.904580-1.4180730.680194
31.4870181.3068481.107998
4-0.6980162.2732521.173093
50.0344840.5963190.846428
............
9995-0.4178921.233352-1.299887
9996-0.019062-1.3431371.003187
99971.7723940.510613-1.499494
99981.397129-0.0384620.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
语文数学英语
悟空104595
悟饭872833
悟天105132113
武神12489113
# 有放回抽样: 结果重复
array = np.random.randint(0, 4, size=(4, ))
array # array([0, 2, 3, 2])
df.take(array)
语文数学英语
悟空104595
悟天105132113
武神12489113
悟天105132113
# np.random.permutation()函数随机排序
arr = np.random.permutation([0, 1, 2, 3])
arr # array([1, 0, 2, 3])
# 无放回抽样; 结果不重复
df.take(arr)
语文数学英语
悟空104595
悟饭872833
武神12489113
悟天105132113

数据聚合

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
colorpriceweight
0red353
1white154
2red051
3cyan752
4cyan651
5green254
6white654
7cyan651
group_obj = df.groupby(by='color') # 返回一个中间对象,可以在这个对象上应用聚合函数来进行数据分析和处理
group_obj # <pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001C9B8CA2DC8>x


# groups: 返回一个字典,其中键是元组,代表分组的唯一组合,值是对应组合的索引列表
group_obj.groups # {'cyan': [3, 4, 7], 'green': [5], 'red': [0, 2], 'white': [1, 6]}


# 分组之后, 对分组的数据进行聚合
# 先聚合, 再取数据
group_obj.mean()[['price']]
price
color
cyan6.333333
green2.000000
red1.500000
white3.500000
# 先取数据, 再聚合
# 运算量比较少, 只对price进行了聚合. 
# 在遇到比较大的dataframe的时候, 推荐这种写法. 
price_mean = group_obj[['price']].mean()
price_mean
price
color
cyan6.333333
green2.000000
red1.500000
white3.500000
# 经过观察发现, 原始dataframe的color列和price_mean的index相同, 可以进行合并. 
pd.merge(df, price_mean, left_on='color', right_index=True, suffixes=['', '_mean'])
colorpriceweightprice_mean
0red3531.500000
2red0511.500000
1white1543.500000
6white6543.500000
3cyan7526.333333
4cyan6516.333333
7cyan6516.333333
5green2542.000000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值