Python pandas自定義函數(shù)的使用方法示例
本文實(shí)例講述了Python pandas自定義函數(shù)的使用方法。分享給大家供大家參考,具體如下:
自定義函數(shù)的使用
import numpy as np import pandas as pd # todo 將自定義的函數(shù)作用到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 定義一個(gè)函數(shù),求其和,絕對值,最大值減最小值的差值,平方 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 使用匿名函數(shù)實(shí)現(xiàn)----求其和,絕對值,最大值減最小值的差值, 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 因?yàn)閍pplymap作用在每個(gè)元素上,所以不需要指定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())#默認(rèn)升序 # print(ser1.sort_index(ascending=False))#指定ascending為降序 # print(df1.sort_index())#默認(rèn)行升序 # 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())#默認(rèn)升序 print(ser1.sort_values(ascending=False))#指定ascending為降序 # dataframe 對象比較復(fù)雜,需要按照哪一列來進(jìn)行排序 print(df1.sort_values(by='a'))#默認(rèn)列升序 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))#行降序
數(shù)據(jù)重構(gòu)
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'])#獲取單個(gè)外層索引 print(ser1['a':'e'])#獲取多個(gè)外層 # todo 內(nèi)層索引取值 print(ser1[:,1]) # todo 指定外層,內(nèi)層索引取值 print(ser1['a',1]) # todo 交換分層-----swaplevel() print(ser1.swaplevel()) # todo 將Sterise轉(zhuǎn)為dataframe對象外層索引作為行索引,內(nèi)層索引作為列索引 print(ser1.unstack()) # todo 將dataframe轉(zhuǎn)為Sterise對象行索引作為外層索引行索引,列索引作為內(nèi)層索引列 print(df1.stack()) # todo dataframe 轉(zhuǎn)字典 print(df1.to_dict()) # todo dataframe 轉(zhuǎn)csv文件 print(df1.to_csv())
數(shù)據(jù)連接操作
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相同時(shí) 通過key連接df1,df2 # print(pd.merge(df1,df2))#不指定,連接df1,df2默認(rèn)通過相同的列來連接 # print(pd.merge(df1,df2,on=data1))#data1相同時(shí) 通過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作業(yè)為右表的行索引作為外檢 print(pd.merge(df1,df2,left_index=True,right_index=True))#left_index,right_index,默認(rèn)的情況下,將兩張表按照航索引的相同情況,合成一條數(shù)據(jù) print(pd.merge(df1,df2,how='left',left_index=True,right_index=True))# 按照行進(jìn)行連接,也能指定鏈接方式
注意點(diǎn):
1.how = inner,默認(rèn)的,內(nèi)連接,多表的交集
2.how = outer,外連接,多表的并集
3.how = left,指定為左連接,展示左表的完整數(shù)據(jù),不管右表有沒有匹配
4.how = right,指定為右連接,展示右表的完整數(shù)據(jù),不管左表有沒有匹配
數(shù)據(jù)的合并
import numpy as np import pandas as pd # todo np數(shù)組的合并 np.concatenate() ,參與合并的數(shù)組,緯度大小是一致的,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]))#多個(gè)Serise 對象需要用【】包起來,默認(rèn)是列合并 # print(pd.concat([ser1,ser2,ser3],axis=1))# axis=1 行合并 ,不夠的部分用NAN填充 # print(pd.concat([ser1,ser2,ser3],axis=1,join='outer'))# 默認(rèn)是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)))# 默認(rèn)按照列合并 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進(jìn)行分組,返回一個(gè)分組對象,分組之后可以用函數(shù)進(jìn)行下一步處理,計(jì)算過程中,非數(shù)字的數(shù)據(jù)不參與計(jì)算 # print(group_obj) # print('--------rrrr-------') # print(group_obj.sum()) # 分組求和 # print(group_obj.mean()) # 分組求均值 # print(group_obj.size()) # 每個(gè)分組的元素個(gè)數(shù) # print(group_obj.count()) # 每個(gè)分組之后,列名里面的個(gè)數(shù) # # # todo 迭代分組對象 注意點(diǎn):1.每一個(gè)元素形式(分組名,屬于分組的數(shù)據(jù))2.屬于該分組的數(shù)據(jù),也是dataframe對象 # for i in group_obj: # print(i) # print('----------') # # todo 迭代分組對象的拆分 # for name,data in group_obj: # print('---') # print(name) # print(data) # # # todo 分組對象轉(zhuǎn)列表 # print(list(group_obj)) # # todo 分組對象轉(zhuǎn)字典 # print(dict(list(group_obj))) # # # # # # todo 聚合(數(shù)組產(chǎn)生標(biāo)量的過程,常常用于分組之后的數(shù)據(jù)運(yùn)算) # # todo 內(nèi)置的聚合函數(shù) # # todo sum() 求和 # # todo mean()平均值 # # todo size() # # todo max() # # todo min() # # todo count # # print(group_obj.describe()) #查看具體的聚合數(shù)據(jù) # todo 使用單個(gè)內(nèi)置函數(shù) # print(group_obj.agg('max'))#agg里面可以填寫內(nèi)置函數(shù),如果需要使用內(nèi)置的函數(shù),要用字符串的形式填寫 # print(group_obj.agg('min')) # # todo 使用多個(gè)內(nèi)置函數(shù) # print(group_obj.agg(['max','min','mean']))#需要用列表的形式 # # todo 使用內(nèi)置的函數(shù)取中文別名 # print(group_obj.agg([('最大值','max'),('最小值','min'),('均值','mean')]))# 第一個(gè)參數(shù)是別名 # todo 自定義函數(shù) def print1(x): # print(x) ret = x.max()-x.min() return ret print(group_obj.agg([('差值',print1)])) # todo 匿名函數(shù) print(lambda x:x.max()-x.min()) # todo data1求最大值,data2 求最小值 不同的列用不同的函數(shù) print(group_obj.agg( { 'data1':['max'], 'data2':[('最小值','min')] }))
數(shù)據(jù)分組之后再合并
import pandas as pd import numpy as np # todo 分組聚合之后數(shù)據(jù)的處理 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進(jìn)行分組, # groupy_obj = df1.groupby(by='key1') # print(groupy_obj) # for name,data in groupy_obj: # print(name) # print(data) # # todo 分組之后進(jìn)行求和操作 # 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進(jìn)行關(guān)聯(lián) # merge_df = pd.merge(df1,sum_data_group,left_on='key1',right_index=True)#左表的列名,右表的行索引名 # print(merge_df) # todo 取數(shù)據(jù)的兩列分組 groupby_obj = df1.loc[:,['data1','data2']].groupby(df1['key1'])#選區(qū)數(shù)據(jù)其中的數(shù)據(jù),按照數(shù)據(jù)中的列進(jìn)行分組 # todo 求和 data = groupby_obj.sum() data1 = groupby_obj.transform('sum').add_prefix('trans_group')#transform 來計(jì)算會維持原來的數(shù)據(jù)結(jié)構(gòu) # todo 按行合并 print(pd.concat([df1,data1],axis=1))
關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python函數(shù)使用技巧總結(jié)》、《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Flask框架學(xué)習(xí)筆記之路由和反向路由詳解【圖文與實(shí)例】
這篇文章主要介紹了Flask框架學(xué)習(xí)筆記之路由和反向路由,結(jié)合圖文與實(shí)例形式詳細(xì)分析了flask框架中路由與反向路由相關(guān)概念、原理、用法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-08-08Python實(shí)現(xiàn)簡單猜數(shù)字游戲
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02python可擴(kuò)展的Blender 3D插件開發(fā)匯總
這篇文章主要為大家介紹了python可擴(kuò)展的Blender 3D插件開發(fā)匯總,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Python構(gòu)造自定義方法來美化字典結(jié)構(gòu)輸出的示例
這篇文章主要介紹了用Python構(gòu)造自定義方法來美化字典結(jié)構(gòu)輸出的示例,原理就是利用遞歸法來拼接字符串,需要的朋友可以參考下2016-06-06教你如何在Pycharm中導(dǎo)入requests模塊
這篇文章主要介紹了教你如何在Pycharm中導(dǎo)入requests模塊,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09Python安裝Numpy和matplotlib的方法(推薦)
下面小編就為大家?guī)硪黄狿ython安裝Numpy和matplotlib的方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11Python二叉樹的鏡像轉(zhuǎn)換實(shí)現(xiàn)方法示例
這篇文章主要介紹了Python二叉樹的鏡像轉(zhuǎn)換實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了二叉樹鏡像轉(zhuǎn)換的原理及Python相關(guān)算法實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-03-03Python+Turtle實(shí)現(xiàn)繪制可愛的小倉鼠
肉嘟嘟的小動(dòng)物很是可愛,這篇文章主要為大家介紹一下如何運(yùn)用Python中的turtle庫控制函數(shù)繪制小倉鼠,文中的實(shí)現(xiàn)方法講解詳細(xì),感興趣的可以嘗試一下2022-10-10