1. 程式人生 > >Python之Pandas學習筆記(三) apply|applymap|map和grouppy

Python之Pandas學習筆記(三) apply|applymap|map和grouppy

文章目錄

一、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的作用就是起到聚合分組函式的功能
2apply處理的是分組後,傳入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是最方便的,各有所長。