如何在Python中使用pandas自定义函数
本篇文章给大家分享的是有关如何在Python中使用pandas自定义函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
自定义函数的使用
importnumpyasnp importpandasaspd #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定义一个函数,求其和,绝对值,最大值减最小值的差值,平方 deffunc(x): #print(x) print('--------------') num=np.max(x)-np.min(x) a=abs(x) b=x**2 #returnnum #returna returnb print(ser1.apply(func)) deffunc1(x): #print(x) print('--------------') #num=np.max(x)-np.min(x) a=abs(x) b=x**2 #returnnum #returna returnb print(df1.apply(func1,axis=1)) #todo使用匿名函数实现----求其和,绝对值,最大值减最小值的差值, print(df1.apply(lambdax:x**2,axis=1)) print('------') print(df1.apply(lambdax:np.max(x)-np.min(x),axis=1)) print('---------') print(df1.apply(lambdax:abs(x),axis=1)) #applymap的使用 #todo使用applymap因为applymap作用在每个元素上,所以不需要指定axis print(df1.applymap(lambdax:x**2)) print('---------') print(df1.applymap(lambdax:abs(x)))
排序
importnumpyasnp importpandasaspd 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))#行降序
数据重构
importnumpyasnp importpandasaspd 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()) #tododataframe转字典 print(df1.to_dict()) #tododataframe转csv文件 print(df1.to_csv())
数据连接操作
importnumpyasnp importpandasaspd 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,指定为右连接,展示右表的完整数据,不管左表有没有匹配
数据的合并
importnumpyasnp importpandasaspd #todonp数组的合并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))#行合并 #todopd的合并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'))#交集合并
分组
importpandasaspd importnumpyasnp 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对象 #foriingroup_obj: #print(i) #print('----------') ##todo迭代分组对象的拆分 #forname,dataingroup_obj: #print('---') #print(name) #print(data) # ##todo分组对象转列表 #print(list(group_obj)) ##todo分组对象转字典 #print(dict(list(group_obj))) # # # # ##todo聚合(数组产生标量的过程,常常用于分组之后的数据运算) ##todo内置的聚合函数 ##todosum()求和 ##todomean()平均值 ##todosize() ##todomax() ##todomin() ##todocount # #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自定义函数 defprint1(x): #print(x) ret=x.max()-x.min() returnret print(group_obj.agg([('差值',print1)])) #todo匿名函数 print(lambdax:x.max()-x.min()) #tododata1求最大值,data2求最小值不同的列用不同的函数 print(group_obj.agg( { 'data1':['max'], 'data2':[('最小值','min')] }))
数据分组之后再合并
importpandasaspd importnumpyasnp #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) #forname,dataingroupy_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中使用pandas自定义函数,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注恰卡编程网行业资讯频道。
推荐阅读
-
Python中怎么动态声明变量赋值
这篇文章将为大家详细讲解有关Python中怎么动态声明变量赋值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文...
-
python中变量的存储原理是什么
-
Python中怎么引用传递变量赋值
这篇文章将为大家详细讲解有关Python中怎么引用传递变量赋值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文...
-
python中怎么获取程序执行文件路径
python中怎么获取程序执行文件路径,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的...
-
Python中如何获取文件系统的使用率
Python中如何获取文件系统的使用率,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴...
-
Python中怎么获取文件的创建和修改时间
这篇文章将为大家详细讲解有关Python中怎么获取文件的创建和修改时间,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读...
-
python中怎么获取依赖包
今天就跟大家聊聊有关python中怎么获取依赖包,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据...
-
python怎么实现批量文件加密功能
-
python中怎么实现threading线程同步
小编给大家分享一下python中怎么实现threading线程同步,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!...
-
python下thread模块创建线程的方法
本篇内容介绍了“python下thread模块创建线程的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来...