python异常数据筛选_python-pandas模块9-数据拆分-异常值筛选-过滤

pandas模块-数据拆分-异常值筛选-过滤

导入模块:

import numpy as np

import pandas as pd

from pandas import Series,DataFrame

from numpy import nan as NA

# matplotlib做图模块

import matplotlib.pyplot as plt

# 处理中文正常显示

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

1.数据拆分(分割,切割)

(1)pd.cut() 根据区间,求数量。 结合 value_counts()

pd.cut(

x, //被分割的对象

bins, // 分箱可以是数字也可以是list-like的分箱

right: bool = True, //默认右边闭合

labels=None, //给每个区间取个别名

retbins: bool = False, //True ,返回一个区间数组

precision: int = 3, // 默认精确到小数点后3位

include_lowest: bool = False, //分割区间默认不包含最小值,True则包含

duplicates: str = ‘raise’,

ordered: bool = True,

)

准备一个数据 ,如 一堆年龄

bins = [18,40,60,100,801]

ages = [16,20,24,28,30,38,40,44,47,54,56,61,66,77,88,99,800]

(1.1)用value_counts

Series(ages).value_counts(bins=bins)

(1.2)用pd.cut()

pd.cut(ages,bins=bins)

pd.cut和value_counts()结合使用,dropna=True默认不保留NaN

pd.cut(ages,bins=bins).value_counts(dropna=False)

right参数,默认bins区间右闭合

pd.cut(ages,bins=bins,right=False)

labels 参数 ,给每个区间取个别名(好处是用值统计显示更直观)

pd.cut(ages,bins=bins,right=True ,labels=['青年','中年','老年','神仙']).value_counts()

retbins参数。默认True ,返回一个区间数组

使用随机数进行分割,先创建一个随机数数组

# 生成有小数的数组

arr = np.random.randn(20)

arr

precision: int = 3, 默认精确到小数点后3位

pd.cut(arr,4 ,precision=3)

include_lowest: bool = False, 分割区间默认不包含最小值

pd.cut(ages,bins ,include_lowest=True)

duplicates: str = ‘raise’ / ‘drop’:造一个特殊数据来分割

arr2 = [1,2,3,4,5]*4

pd.cut(arr2 ,bins = [1,2,2,3,4,5] ,duplicates='drop',include_lowest=True)

(2)pd.qcut() 根据数量,求区间。 结合 value_counts()

pd.qcut(

x,

q, // 可以是整数等分,也可以是 [0 , 0.1 ,0.3 ,0.6 ,1] 比例

labels=None,

retbins: bool = False,

precision: int = 3,

duplicates: str = ‘raise’,

)

先创建随机100个人的年龄

array=np.random.randint(0,101,100)

array

q可以用整数等分

pd.qcut(array,4)

pd.qcut(array,4).value_counts()

q也可以用比例来分

pd.qcut(array,q=[0 ,0.1,0.3,0.6 ,1 ] )

pd.qcut(array,q=[0 ,0.1,0.3,0.6 ,1 ] ).value_counts()

retbins参数,返回一个区间数组

pd.qcut(array,4 ,retbins=True)

# 取最后一行的区间数组

pd.qcut(array,4 ,retbins=True)[-1]

2.检查和过滤异常值

(1)筛选

先创建一个数组,假设 我们统计马拉松选手的年龄 18-60

age = Series(np.random.randint(10,70,3000))

age

找出年龄在18-60之间有多少人

用匿名函数判断

age.apply(lambda x:x if 18<=x<=60 else NA).count()

用值计数bins区间求

age.value_counts(bins=[18,60])

用刚学的数据拆分来求

pd.cut(age,bins=[18,60],include_lowest=True).value_counts()

假设参赛人数就是3000人,把小于18的全部替换成18 ,大于60替换成60

age2=age.copy()

方法1:用函数判断

def filterNum(x):

if x<=18:

return 18

elif x>=60:

return 60

else:

return x

age2.apply(filterNum)

方法2:用匿名函数

age2.apply(lambda x:18 if x<=18 else x).apply(lambda x:60 if x>=60 else x)

方法3:

age2[age2<18]=18

age2[age2>60]=60

age2

方法4:用replace

age.replace(np.arange(10,18),18).replace(np.arange(60,70),60)

(2)过滤

创建一个数据

data = DataFrame(np.random.randn(1000,4) ,columns=list('ABCD'))

data

假设绝对值 大于3 的都是 异常值

方法1:取出一列的数据

data.C[data.C.abs()>3]

方法2:可以直接用 dataframe 与 3 比较

# ABCD列都有 True,所以每列都有异常值

np.abs(data)>3.any(axis=0)

data[ (np.abs(data)>3).any(axis=1) ]

方法3:处理所有值,将绝对值大于3的变成 +3 或 -3 。通过np.sign( )获取符号位

result = data.applymap(lambda x:np.sign(x)*3 if np.abs(x)>3 else x)

result

如果某行有 绝对值大于3 的,全部换成 3 或 -3

data[ (np.abs(data)>3).any(axis=1) ]

每个数的符号位 乘以 3

np.sign(data)*3

对筛选的数据进行 替换 ,会只替换掉那些 行索引 匹配的值

data[ (np.abs(data)>3).any(axis=1) ] = np.sign(data)*3

data.loc[512:515]

3.

Series.apply( 某个函数 )

DataFrame.applymap( 某个函数 )

都是对单个值处理的

原文链接:https://blog.csdn.net/huskyKKK/article/details/108207909

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python数据处理可以使用pandas库来实现。pandas库提供了丰富的功能和方法,可以对数据进行清洗、处理和分析。在数据处理过程中,可以使用pandas的DataFrame对象来表示和操作数据。可以使用DataFrame对象的方法来删除空值、重复值和异常值。例如,可以使用dropna()方法来删除DataFrame中的空值,使用drop_duplicates()方法来删除重复值,使用条件筛选来删除异常值。\[3\]此外,pandas还提供了其他一些方法来处理数据,如合并、拆分、排序、过滤等。可以使用pandas的方法来对数据进行转换、计算和统计分析。同时,还可以使用matplotlib包来进行数据可视化,以便更好地理解和展示数据。\[2\]总之,Python数据处理功能强大且灵活,可以满足各种数据处理需求。 #### 引用[.reference_title] - *1* [Python数据处理](https://blog.csdn.net/qq_62789540/article/details/122541001)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Python深度学习:Python数据处理及可视化(读书笔记)](https://blog.csdn.net/awaitxm/article/details/122657531)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【Python数据处理】—— 常用Python数据处理方法](https://blog.csdn.net/wellcoder/article/details/129960671)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值