Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 952|回复: 0

Python数据分析库pandas ------ pandas 删除重复元素、用映射替换添加元素、重命名轴索引、离散化、异常值检测和过滤、排序

[复制链接]
  • TA的每日心情
    奋斗
    7 天前
  • 签到天数: 745 天

    [LV.9]以坛为家II

    2041

    主题

    2099

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    704660
    发表于 2021-4-18 01:34:13 | 显示全部楼层 |阅读模式

     数据转换

     删除重复元素

      DataFrame对象的duplicated()函数可用来检测重复的行,返回元素为布尔型的Series对象。 每个元素对

    应一行,如果该行与其他行重复(也就是说该行不是第一次出现),则元素为True; 如果跟前面不重复,则元

    素就为False。

      返回元素为布尔值的Series对象用处很大,特别适用于过滤操作。通常,所有重复的行都需要从DataFrame

    对象中删除。pandas库的drop_duplicates()函数实现了删除功能,该函数返回的是删除重复行后的DataFmme对

    象。

     

     1 dframe = pd.DataFrame({ 'color': ['white','white','red','red','white'],'value': [2,1,3,3,2]})  2 print(dframe)  3 print(dframe.duplicated())  4 # 返回元素为布尔值的Series对象用处很大,特别适用于过滤操作。  5 print( dframe[dframe.duplicated()])  6 print(dframe.drop_duplicates())  7 输出:  8  color value  9 0 white 2 10 1 white 1 11 2 red 3 12 3 red 3 13 4 white 2 14 0 False 15 1 False 16 2 False 17 3 True 18 4 True 19 dtype: bool 20  color value 21 3 red 3 22 4 white 2 23  color value 24 0 white 2 25 1 white 1 26 2 red 3

     

     用映射替换元素

      要用新元素替换不正确的元素,需要定义一组映射关系。在映射关系中,旧元素作为键,新元素作为值。

      DataFrame对象中两种旧颜色被替换为正确的元素。还有一种常见情况,是把NaN替换为其他值,比如0。

    这种情况下,仍然可以用replace()函数,它能优雅地完成该项操作。

     1 frame8 = pd.DataFrame({  2 'item': ['ball', 'mug', 'pen', 'pencil', 'ashtray'],  3 'color': ['white', 'rosso', 'verde', 'black', 'yellow'],  4 'price': [5.56, 4.20, 1.30, 0.56, 2.75]  5 })  6 print(frame8)  7 newcolors = {  8 'rosso': 'red',  9 'verde': 'green' 10 } 11 print(frame8.replace(newcolors)) 12 13 ser = pd.Series([13, np.nan, 4, 6, np.nan, 3]) 14 print(ser.replace(np.nan, 0))

      输出结果:

      

     

     用映射添加元素

      下面只是部分功能的展示,详情请参考官方文档

     1 frame9 = pd.DataFrame({  2 'item':['ball','mug','pen','pencil','ashtray'],  3 'color':['white','red','green','black','yellow']  4 })  5 print(frame9)  6 price = {  7 'ball' : 5.56,  8 'mug' : 4.20,  9 'bottle1' : 1.30, 10 'scissors' : 3.41, 11 'pen' : 1.30, 12 'pencil' : 0.56, 13 'ashtray' : 2.75 14 } 15 frame9['price'] = frame9['item'].map(price) # 这里是按‘item’的对应关系添加 16 print(frame9)

      输出结果:

      

      官方文档案例:

    1 df = pd.DataFrame({ 2 'A': ['bat', 'foo', 'ibat'], 3 'B': ['abc', 'bar', 'xyz'] 4 }) 5 # r'^ba.$'是匹配最后三个字符中前面量为ba的;$匹配结尾的 6 print(df.replace(to_replace=r'^ba.$', value='new', regex=True))

      输出结果:(上面关于正则的知识点请点击参考博客

      

     

     重命名轴索引

       对于只有单个元素要替换的最简单情况,可以对传入的参数做进一步限定,而无需把多个变 量都写出来,

    也避免产生多次赋值操作。对于多个元素替换最好用字典先写好。

     1 reindex = {  2 0:'first',  3 1:'second',  4 2:'third',  5 3:'fourth',  6 4:'fifth'  7 }  8 print(frame9.rename(reindex))  9 recolumn ={ 10 'item':'object', 11 'price':'value' 12 } 13 print(frame9.rename(index=reindex,columns=recolumn)) # 不会改变原数据frame9 14 print(frame9) 15 print(frame9.rename(index={1:'first'},columns={'item':'object'})) 16 # inplace=True用于指定在原数据frame9上面改 17 frame9.rename(index={1:'first'},columns={'item':'object'},inplace=True) 18 print(frame9)

      输出结果:

                 

     

      离散化和面元划分

       每个面元的出现次数,即每个类别有多少个元素,可使用value_counts()函数。

       cut 是等差划分面元, qcut 是根据分位数划分面元。

     1 ages = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32]  2 bins = [18, 25, 35, 60, 100]  3 # cut(x, bins, right=True, labels=None, retbins=False, precision=3,  4 # include_lowest=False, duplicates='raise')  5 cat = pd.cut(ages, bins)  6 print(cat, "\n-----* 1 *-----\n")  7 # cat.codes 输出每个元素对应的面元编码  8 print(cat.codes, "\n-----* 2 *-----\n")  9 print(pd.value_counts(cat), "\n-----* 3 *-----\n") # 查看每个面元中元素的数量 10 cuts = pd.cut(ages, bins, right=False) # 使用right=False可以修改开端和闭端 11 print(cuts, "\n-----* 4 *-----\n") 12 cut1 = pd.cut(ages, bins, right=False, labels=list('abcd')) 13 print(cut1, "\n-----* 5 *-----\n") 14 15 print(pd.cut(ages, 5), "\n-----* 6 *-----\n") # 如果cut传入的是数字n,那么就会均分成n份。 16 print(pd.value_counts(pd.cut(ages, 4)), "\n-----* 7 *-----\n") 17 # qcut 18 # qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise') 19 # 基于分位数的离散化函数。将变量离散成 20 # 基于等级或基于样本分位数的相等大小的面元。 21 print(pd.qcut(ages, 5), "\n-----* 8 *-----\n") 22 print(pd.value_counts(pd.qcut(ages, 4)), "\n-----* 9 *-----\n")

     

      输出结果:

      

      

      

     

      异常值检测和过滤

      假设将比标准差大3倍的元素视作异常值。用std()函数就可以求得DataFrame对象每一列的标准差。

    1 data = pd.DataFrame(np.random.randn(1000,3)) 2 print(data.describe()) 3 print(data.std()) 4 print(data[(np.abs(data)>(3*data.std())).any(1)]) # 过滤条件 any(1)只要有一个大于3*sigma就满足条件

      

     

     排序

    1 nframe = pd.DataFrame(np.arange(25).reshape(5,5)) 2 new_order = np.random.permutation(5) #乱序整数[0-4] 如果是100 [0-99] 3 print(nframe.take(new_order)) #排序 4 print(np.random.permutation(100)) 5 print(nframe.take([3,4,2])) #只对一部分排序 6 sample = np.random.randint(len(nframe),size =3) #随机整数 7 print(nframe.take(sample))

      输出结果:

      

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

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

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-3-29 14:45 , Processed in 0.063198 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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