Python之Pandas學習筆記(三) apply|applymap|map和grouppy
阿新 • • 發佈:2019-01-11
文章目錄
一、apply|applymap|map 異同分析
分類 | apply | applymap | map |
---|---|---|---|
作用 | apply內的函式在資料框(dataframe)的指定行列中 | applymap函式作用在資料框的所有值中 | map內的函式作用在Series的所有值中 |
說明 | apply預設引數axis=0:作用與列,axis= 1即作用於行 | — | — |
實現 | 作用列:data_test.appply(函式) 作用行:data_test.apply(函式,axis=1) | data_test.appplymap(函式) | data_test.map(函式) |
import numpy as np
import pandas as pd
ran = np.random.randint(10,size=(5,5))
ran
array( [[5, 6, 7, 0, 0],
[3, 4, 2, 9, 2],
[7, 3, 2, 0, 6],
[2, 3, 5, 1, 7],
[1, 5, 9, 4, 7]])
data_test = pd.DataFrame(data=ran,columns = ["A","B","C","D","E"],index=[1,2,3,4,5])
# 一、匿名函式
nm = lambda x:x*x
# 1、applymap方法:作用在該資料框的每一個元素,讓所有元素平方
data_test.applymap(nm)
A B C D E
1 25 36 49 0 0
2 9 16 4 81 4
3 49 9 4 0 36
4 4 9 25 1 49
5 1 25 81 16 49
# 2、 apply方法,作用在該資料框的指定列元素(預設引數 axis = 0 表示對列操作)
data_test.apply(nm)
A B C D E
1 25 36 49 0 0
2 9 16 4 81 4
3 49 9 4 0 36
4 4 9 25 1 49
5 1 25 81 16 49
# 3、 apply 方法,作用於資料框的行 axis = 1,
data_test.apply(nm,axis = 1)
A B C D E
1 25 36 49 0 0
2 9 16 4 81 4
3 49 9 4 0 36
4 4 9 25 1 49
5 1 25 81 16 49
# 4、 map 方法 :map 方法類似於:apply的 預設axis =0
\```
注意:這裡使用apply,和applympa函式的效果是一致的,但是函式作用的物件不同,該匿名函式的引數x既可以是某個元素值,也可以是該資料框的某列,也說明了資料框的列可以進行加減乘除運算
\```
# 二、 匿名函式 2 :效果保留小數點後兩位小數
format = lambda x :"%.2f"%x
# 2.1 使用applymap函式
data_test.applymap(format)
A B C D E
1 5.00 6.00 7.00 0.00 0.00
2 3.00 4.00 2.00 9.00 2.00
3 7.00 3.00 2.00 0.00 6.00
4 2.00 3.00 5.00 1.00 7.00
5 1.00 5.00 9.00 4.00 7.00
# 2.1 使用 apply函式 :這時,該函式只能作用於某列,
#如果沒有指定某列,直接作用在資料框就會報錯。
data_test.A.apply(format)
1 5.00
2 3.00
3 7.00
4 2.00
5 1.00
Name: A, dtype: object
二、apply 與 grounpy 的綜合運用
df=pd.DataFrame({'key':list('ABCABC'),'data1':range(6),'data2':np.random.randint(1,8,size=(6,))})
\```
分別用applay,agg和transform 三個函式去處理分組物件
\```
# 1、建立以 key列的分組的迭代器
grouped = df.groupby("key")
# 2、
for (key,group) in grouped:
print(key)
print(group)
A
key data1 data2
0 A 0 4
3 A 3 5
B
key data1 data2
1 B 1 1
4 B 4 5
C
key data1 data2
2 C 2 2
5 C 5 4
# 一、使用apply聚合 sum函式,max函式,min函式
grouped.apply(sum)
key data1 data2
key
A AA 3 8
B BB 5 7
C CC 7 12
# 二、使用agg聚合
grouped.agg(sum)
data1 data2
key
A 3 9
B 5 6
C 7 6
# 三、使用 transform 聚合
data1 data2
0 3 8
1 5 7
2 7 12
3 3 8
4 5 7
5 7 12
總結:
1、agg的作用就是起到聚合分組函式的功能
2、apply處理的是分組後,傳入apply的函式的DataFrame的所有列。
3、transform和apply及agg的區別就很清楚了,它是把所有列求和的值, 然後再返回原資料結構,所以返回的資料結構大小是不變的,這一點有其很特殊的地位。
# agg函式輸入 list 或 字典
group.agg(['min',np.median,max])
group.agg({'data1':'min','data2':'max'})
data1 data2
min median max min median max
key
A 0 1.5 3 3 4.0 5
B 1 2.5 4 0 3.5 7
C 2 3.5 5 3 6.0 9
data1 data2
key
A 0 5
B 1 5
C 2 4
# 定義 一個處理分組資料的函式
def sum_transform(grouped):
grouped['sum_data1'] = grouped.data1.sum()
grouped['sum_data1'] = grouped.data2.sum()
return grouped
group.apply(sum_transform)
# 總結:三個方法中,apply是最靈活的,但是對於分組資料的聚合,用agg是最方便的,對於分組轉換和展開,transform是最方便的,各有所長。