pandas:資料迭代、函式應用
阿新 • • 發佈:2022-05-06
1、資料迭代
1.1 迭代行
(1)df.iterrows()
for index, row in df[0:5].iterrows(): #需要兩個變數承接資料
print(row)
print("\n")
for index, row in df[0:5].iterrows():
print(row.team) #通過物件屬性方式
print(row['name']) #通過字典方式讀取具體列
print("\n")
(2)df.iertuples()
#生成一個nametuples型別的資料,預設name為Pandas(可在引數中指定) for row in df[0:5].itertuples(): print(row,"\n")
for row in df[0:5].itertuples():
print(row.name,"\n") #可以通過元素屬性的方式取出具體值
1.2 迭代列
(1)df.iteritems()、df.items()
# df.items(),df.iteritems() 迭代時返回(列名,本列的series結構資料)
for label, item in df[0:5].items(): #label是列名
print(label,item)
print("\n")
for label, item in df[0:5].items(): print(item) #item的資料結構是series(有行索引,和資料) print("\n")
for label, colunm in df[0:5].items():
print(colunm.sort_values()) #資料結構是series(有行索引,和資料)因此可以使用series的方法
print("\n")
(2)對dataframe直接進行迭代
for item in df:
print(item) #item會得到df的列名
print("\n")
for item in df: print(df[item]) #item會得到df的列名,通過df[item]又可以得到每個列的值 print("\n")
2、函式應用
2.1 pipe()
#將複雜的呼叫簡化,語法結構為df.pipe(<函式名>,<引數列表或字典>)
#ta將dataframe或series作為函式的第一個引數
#定義一個函式,給所有季度的成績加n,然後增加一個平均數
def add_mean(df,n):
n_df = df.copy()
n_df = n_df.loc[:,'Q1':'Q4'] + n
n_df['avg'] = n_df.sum(1)
return n_df
add_mean(df,100) #此時原本的df沒變
df.pipe(add_mean,100) #執行結果與上圖一致
#函式部分還可以使用lambda
df.pipe(lambda df,x,y: df[(df.Q1>x) & (df.Q2 >y)],60,70) #選出df中同時滿足Q1>60,Q2>70的資料
2.2 apply()
#apply(),對df按行和列(預設逐列傳入)進行函式處理,也支援series(傳入具體值)
#將name轉換為全小寫
df.name.apply(lambda x : x.lower())
#計算每個季度的平均成績,計算方法為去掉一個最高分和去掉一個最低分
def avg(s ):
min = s.min()
max = s.max()
average = (s.sum()-min-max)/ (s.count()-2)
return average
df.select_dtypes(include='number').apply(avg)
#計算每個學生的平均成績
df1 = df.set_index('name')
df1.select_dtypes(include='number').apply(avg)
#與np.where()配合使用 np.where(邏輯表示式,替換值1,替換值2)
df.apply(lambda x: (x.team=='A') & (x.Q1>90), axis=1).map({True:'GOOD',False:'Other'})
2.3 applymap()
#applymap(),對dataframe或者series的所有元素(不包括索引)應用函式處理
#使用lambda時,變數是指具體的值
#例子:計算每個資料的長度
df.applymap(lambda x:len(str(x)))
2.4 map()
#map()根據輸入對應關係對映值返回最終資料
#可傳入一個人字典(鍵為原值,值為新值)
#可傳入一個函式(引數為series的每個值)
df.team.map({'A':'一班','B':'二班','C':'三班','D':'四班'}) #沒有對映值的會被填為NAN
df.team.map('I am a {}'.format) #傳入格式化表示式來格式化資料內容
df.Q1.map('11{}'.format) #數字會被轉為字元
2.5 agg()
#agg使用指定軸上的一項或多項操作進行彙總
#可以傳入一個函式揮著函式的字元
#每列的最大值
df.agg('max')
#將所有列聚合產生sum和min兩行
#傳入多個函式
df.agg(['sum','min'])
#序列多個聚合
df.agg({'Q1':['sum','min'],'Q2':['sum','max']})
#分組後聚合
df.groupby('team').agg('max')
#支援每個列分別用不同的方法聚合
#支援指定軸的方向
#1、不同列使用不同的方法進行聚合
df.agg(最大值=('Q1',max),
最小值=('Q2',min),
平均值=('Q3',np.mean),
求和=('Q4',lambda x :x.sum())
)
#2、按行聚合
df.loc[:,'Q1':'Q4'].agg(np.mean,axis=1)
2.6 transform()
#datafram或者series自身呼叫函式,並返回一個與自身長度相同的資料
#1、應用匿名函式
df.transform(lambda x:x*2) #字串會變成重複兩遍,數字會*2
#呼叫多個函式
df.transform([np.sqrt,np.exp]) #自動篩選數字列,並應用
3、參考文獻
《深入淺出Pandas》