圆月山庄资源网 Design By www.vgjia.com
本文实例讲述了Python pandas自定义函数的使用方法。分享给大家供大家参考,具体如下:
自定义函数的使用
import numpy as np import pandas as pd # todo 将自定义的函数作用到dataframe的行和列 或者Serise的行上 ser1 = pd.Series(np.random.randint(-10,10,5),index=list('abcde')) df1 = pd.DataFrame(np.random.randint(-10,10,(4,5)),index=list('ACBD'),columns=list('abcde')) # todo 定义一个函数,求其和,绝对值,最大值减最小值的差值,平方 def func(x): # print(x) print('--------------') num= np.max(x)-np.min(x) a = abs(x) b= x**2 # return num # return a return b print(ser1.apply(func)) def func1(x): # print(x) print('--------------') # num= np.max(x)-np.min(x) a = abs(x) b= x**2 # return num # return a return b print(df1.apply(func1,axis = 1)) # todo 使用匿名函数实现----求其和,绝对值,最大值减最小值的差值, print(df1.apply(lambda x:x**2,axis=1)) print('------') print(df1.apply(lambda x:np.max(x)-np.min(x),axis=1)) print('---------') print(df1.apply(lambda x:abs(x),axis=1)) # applymap的使用 # todo 使用applymap 因为applymap作用在每个元素上,所以不需要指定axis print(df1.applymap(lambda x:x**2)) print('---------') print(df1.applymap(lambda x:abs(x)))
排序
import numpy as np import pandas as pd ser1 = pd.Series(np.random.randint(-10,10,10),index=list('acbdfeghji')) df1 = pd.DataFrame(np.random.randint(-10,10,(4,5)),index=list('ADBC'),columns=list('abcde')) print(ser1) print(df1) print('------------------') # todo 按照索引排序 sort_index() # print(ser1.sort_index())#默认升序 # print(ser1.sort_index(ascending=False))#指定ascending为降序 # print(df1.sort_index())#默认行升序 # print(df1.sort_index(ascending=False))#行降序 # print(df1.sort_index(axis=1))#列升序 # print(df1.sort_index(ascending=False,axis=1))#列降序 # todo 按照值排序 print(ser1.sort_values())#默认升序 print(ser1.sort_values(ascending=False))#指定ascending为降序 # dataframe 对象比较复杂,需要按照哪一列来进行排序 print(df1.sort_values(by='a'))#默认列升序 print(df1.sort_values(by='a',ascending=False))#列降序 print(df1.sort_values(by='A',axis=1))#行升序 print(df1.sort_values(by='A',ascending=False,axis=1))#行降序
数据重构
import numpy as np import pandas as pd ser1 = pd.Series(np.random.randint(-10,10,10),index=[list('aabbccddee'),[1,2,1,2,1,2,1,2,1,2]]) df1 = pd.DataFrame(np.random.randint(-10,10,(4,5)),index=list('aabb'),columns=list('abcde')) print(ser1) print(df1) print('-----------------------') # todo 外层索引取值 print(ser1['a'])#获取单个外层索引 print(ser1['a':'e'])#获取多个外层 # todo 内层索引取值 print(ser1[:,1]) # todo 指定外层,内层索引取值 print(ser1['a',1]) # todo 交换分层-----swaplevel() print(ser1.swaplevel()) # todo 将Sterise转为dataframe对象外层索引作为行索引,内层索引作为列索引 print(ser1.unstack()) # todo 将dataframe转为Sterise对象行索引作为外层索引行索引,列索引作为内层索引列 print(df1.stack()) # todo dataframe 转字典 print(df1.to_dict()) # todo dataframe 转csv文件 print(df1.to_csv())
数据连接操作
import numpy as np import pandas as pd df1 = pd.DataFrame( {'key1':list('abcdefgh'),'data1':np.random.randint(-5,10,8)} ) df2 = pd.DataFrame( {'key2':list('defgh'),'data2':np.random.randint(-5,10,5)} ) print(df1) print(df2) print('--------------------------') # todo 链接 # print(pd.merge(df1,df2,on='key'))# key相同时 通过key连接df1,df2 # print(pd.merge(df1,df2))#不指定,连接df1,df2默认通过相同的列来连接 # print(pd.merge(df1,df2,on=data1))#data1相同时 通过data1连接df1,df2 #todo 交集 print(pd.merge(df1,df2,left_on='key1',right_on='key2')) #todo 并集 print(pd.merge(df1,df2,how='outer',left_on='key1',right_on='key2')) #todo 左连接 print(pd.merge(df1,df2,how='left',left_on='key1',right_on='key2')) #todo 右连接 print(pd.merge(df1,df2,how='right',left_on='key1',right_on='key2')) # todo 通过行索引来指定 print(pd.merge(df1,df2,left_on='data1',right_index=True))#left_on指定左表的列索引为外健,right_index作业为右表的行索引作为外检 print(pd.merge(df1,df2,left_index=True,right_index=True))#left_index,right_index,默认的情况下,将两张表按照航索引的相同情况,合成一条数据 print(pd.merge(df1,df2,how='left',left_index=True,right_index=True))# 按照行进行连接,也能指定链接方式
注意点:
1.how = inner,默认的,内连接,多表的交集
2.how = outer,外连接,多表的并集
3.how = left,指定为左连接,展示左表的完整数据,不管右表有没有匹配
4.how = right,指定为右连接,展示右表的完整数据,不管左表有没有匹配
数据的合并
import numpy as np import pandas as pd # todo np数组的合并 np.concatenate() ,参与合并的数组,纬度大小是一致的,axis=1 为行排序 # arr1 = np.random.randint(10,20,(3,4)) # arr2 = np.random.randint(10,20,(3,4)) # print(arr1) # print(arr2) # print('-------------') # print(np.concatenate((arr1,arr2),axis=0)) #列合并 # print('----------') # print(np.concatenate((arr1,arr2),axis=1)) # 行合并 # todo pd的合并 pd.concat() # ser1 = pd.Series(np.random.randint(10,20,3)) # ser2 = pd.Series(np.random.randint(10,20,5)) # ser3 = pd.Series(np.random.randint(10,20,7)) # print(ser1) # print(ser2) # print(ser3) # print('-------------') # # print(pd.concat([ser1,ser2,ser3]))#多个Serise 对象需要用【】包起来,默认是列合并 # print(pd.concat([ser1,ser2,ser3],axis=1))# axis=1 行合并 ,不够的部分用NAN填充 # print(pd.concat([ser1,ser2,ser3],axis=1,join='outer'))# 默认是outer 并集 df1 = pd.DataFrame( {'key1':list('abcdefgh'),'data1':np.random.randint(-5,10,8)} ) df2 = pd.DataFrame( {'key2':list('abcde'),'data2':np.random.randint(-5,10,5)} ) print(pd.concat((df1,df2)))# 默认按照列合并 print(pd.concat((df1,df2),axis=1))# 按照行合并 print(pd.concat((df1,df2),axis=1,join='inner'))# 交集合并
分组
import pandas as pd import numpy as np df1 = pd.DataFrame( {'key1':list('abcdefgh'),'data1':np.random.randint(-5,10,8),'key2':list('11223344'),'data2':np.random.randint(-5,10,8)} ) print(df1) df2 = pd.DataFrame( {'key2':list('abcde'),'data2':np.random.randint(-5,10,5)} ) print('----------------') # todo 分组 groupby() group_obj = df1.groupby(by='key2')#通过key1进行分组,返回一个分组对象,分组之后可以用函数进行下一步处理,计算过程中,非数字的数据不参与计算 # print(group_obj) # print('--------rrrr-------') # print(group_obj.sum()) # 分组求和 # print(group_obj.mean()) # 分组求均值 # print(group_obj.size()) # 每个分组的元素个数 # print(group_obj.count()) # 每个分组之后,列名里面的个数 # # # todo 迭代分组对象 注意点:1.每一个元素形式(分组名,属于分组的数据)2.属于该分组的数据,也是dataframe对象 # for i in group_obj: # print(i) # print('----------') # # todo 迭代分组对象的拆分 # for name,data in group_obj: # print('---') # print(name) # print(data) # # # todo 分组对象转列表 # print(list(group_obj)) # # todo 分组对象转字典 # print(dict(list(group_obj))) # # # # # # todo 聚合(数组产生标量的过程,常常用于分组之后的数据运算) # # todo 内置的聚合函数 # # todo sum() 求和 # # todo mean()平均值 # # todo size() # # todo max() # # todo min() # # todo count # # print(group_obj.describe()) #查看具体的聚合数据 # todo 使用单个内置函数 # print(group_obj.agg('max'))#agg里面可以填写内置函数,如果需要使用内置的函数,要用字符串的形式填写 # print(group_obj.agg('min')) # # todo 使用多个内置函数 # print(group_obj.agg(['max','min','mean']))#需要用列表的形式 # # todo 使用内置的函数取中文别名 # print(group_obj.agg([('最大值','max'),('最小值','min'),('均值','mean')]))# 第一个参数是别名 # todo 自定义函数 def print1(x): # print(x) ret = x.max()-x.min() return ret print(group_obj.agg([('差值',print1)])) # todo 匿名函数 print(lambda x:x.max()-x.min()) # todo data1求最大值,data2 求最小值 不同的列用不同的函数 print(group_obj.agg( { 'data1':['max'], 'data2':[('最小值','min')] }))
数据分组之后再合并
import pandas as pd import numpy as np # todo 分组聚合之后数据的处理 dict_new = { 'data1':np.random.randint(5,15,8), 'data2':np.random.randint(5,15,8), 'data3':4, 'key1':list('aabbccdd'), 'key2':['one','two','three','one','two','three','one','two'] } df1 = pd.DataFrame(dict_new,index=list('ADCBFEGH')) print(df1) # # todo 按照key1进行分组, # groupy_obj = df1.groupby(by='key1') # print(groupy_obj) # for name,data in groupy_obj: # print(name) # print(data) # # todo 分组之后进行求和操作 # sum_data_group = groupy_obj.sum() # print(sum_data_group) # # todo 分组之后增加前缀 # sum_data_group = sum_data_group.add_prefix('group_key1') # print(sum_data_group) # # todo 先用merge进行关联 # merge_df = pd.merge(df1,sum_data_group,left_on='key1',right_index=True)#左表的列名,右表的行索引名 # print(merge_df) # todo 取数据的两列分组 groupby_obj = df1.loc[:,['data1','data2']].groupby(df1['key1'])#选区数据其中的数据,按照数据中的列进行分组 # todo 求和 data = groupby_obj.sum() data1 = groupby_obj.transform('sum').add_prefix('trans_group')#transform 来计算会维持原来的数据结构 # todo 按行合并 print(pd.concat([df1,data1],axis=1))
关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
圆月山庄资源网 Design By www.vgjia.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
圆月山庄资源网 Design By www.vgjia.com
暂无评论...
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
2024年11月05日
2024年11月05日
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]