參考資料:活用pandas庫
? ? ? ? apply是指把函數同時作用于DataFrame的每一行或每一列。類似于編寫一些跨每行或每列的for循環,并同時調用apply函數。
1、函數
? ? ? ? 函數是對python代碼進行分組和復用的一種方法。如果某段代碼會被多次使用,并且使用時是需要做少量修改,這時就應該考慮把這段代碼放入一個函數中。
# 編寫一個函數
# 求平方的函數
def my_sq(x):"""求平方"""return x**2# 求平均數的函數
def my_avg(x,y):"""求兩個數的平均值"""return(x+y)/2
? ? ? ? 三重引號中的文本是文檔字符串。在查找某個函數的幫助文檔時,就會看到它們。可以是使用這些文檔字符串為自定的函數創建幫助文檔。
2、使用函數
# 導入庫
import pandas as pd# 創建一個DataFrame
df=pd.DataFrame({'a':[10,20,30],'b':[20,30,40]
})
(1)Series的apply方法
? ? ? ? Series有一個apply方法。該方法有一個func參數。當傳遞給它一個函數之后,apply方法就會把傳入的函數應用于Series的每個元素。
# 把自定義的平方函數應用于列a
sq=df['a'].apply(my_sq)
print(sq)
? ? ? ? 請注意,當把my_sq傳遞給apply時,不要在my_sq后面加上圓括號。
? ? ? ? 當自定函數有多個參數時,系統會將Series數據分配給第一個參數。
# 定義一個冪函數,包含兩個參數
def my_exp(x,e):return x**e
# 當把my_exp函數應用于一個Series時,除了要把my_exp傳遞給apply之外,
# 還要多久傳遞一個參數,用于指定指數的大小。
# 傳遞改參數時,可以使用關鍵字參數。
ex=df['a'].apply(my_exp,e=3)
print(ex)
(2)DataFrame的apply方法
? ? ? ? DataFrame通常有至少兩個維度(或稱字段/列)。因此,當向DataFrame應用一個函數時,首先需要指定應用該函數的軸,例如逐行或逐列。
? ? ? ? 如果把apply方法的axis參數設置為0(默認值),則表示按列應用指定函數。如果把axis參數設置為1,則按行應用指定函數。
? ? ? ? 當向DataFrame應用一個函數時(默認按列應用),這個軸(如列)會傳遞到函數的第一個參數中。
# 自定義一個函數,它接收一個值,并將其輸出。
def print_me(x):print(x)# 按列應用,函數的第一個參數就是一個完整數據列,而不是一列的某個值
df.apply(print_me)
? ? ? ? 如下的應用函數則會報錯:
# 自定義一個函數,含有3個參數
def avg_3(x,y,z):return (x+y+z)/3
#
df.apply(avg_3)
? ? ? ? 正確的函數應用應該是:
3、apply高級用法
# 導入numpy庫
import numpy as np
# 導入Titanic數據集
titanic=pd.read_csv(r"...\seaborn常用數據案例\titanic.csv")
# 查看數據集的基本信息
print(titanic.info())# 編寫函數
def count_missing(vec):"""計算一個向量中缺失值的個數"""# 根據值是否缺失獲取一個由True/False值組成的向量null_vec=pd.isnull(vec)# 得到null_vec中的null值得個數# null值對應True,True為1,False為0null_count=np.sum(null_vec)# 返回向量中缺失值的個數return null_countdef prop_missing(vec):"""計算向量中缺失值的占比"""# 調用count_missing函數計算缺失值的個數num=count_missing(vec)# 獲得向量中元素的個數dem=vec.size# 返回缺失值的占比return num/demdef prop_complete(vec):"""向量中非缺失值的占比"""# 調用prop_missing函數計算缺失值的占比return 1-prop_missing(vec)# 按列應用,用于對列的缺失數據情況進行分析
cmis_col=titanic.apply(count_missing)
pmis_col=titanic.apply(prop_missing)
pcom_col=titanic.apply(prop_complete)
print(cmis_col)
print(pmis_col)
print(pcom_col)# 按行應用,用于行的缺失數據分析
cmis_row=titanic.apply(count_missing,axis=1)
pmis_row=titanic.apply(prop_missing,axis=1)
pcom_row=titanic.apply(prop_complete,axis=1)
print(cmis_row.head())
print(pmis_row.head())
print(pcom_row.head())