Python pandas自定義函數的使用方法示例

這篇文章主要介紹了Python pandas自定義函數的使用方法,結合實例形式分析了pandas模塊相關自定義函數數值運算操作技巧,需要的朋友可以參考下

本文實例講述了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學習聚集地,[點擊進入],這裏有我收集以前學習心得,學習筆記,還有一線企業的工作經驗,且給大定on零基礎到項目實戰的資料,大家也可以在下方,留言,把不懂的提出來,大家一起學習進步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章