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
1253649002916481434994036449251495125811649# 2、 apply方法,作用在该数据框的指定列元素(默认参数 axis = 0 表示对列操作)
data_test.apply(nm)
A B C D E
1253649002916481434994036449251495125811649# 3、 apply 方法,作用于数据框的行 axis = 1,
data_test.apply(nm,axis =1)
A B C D E
1253649002916481434994036449251495125811649# 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
15.006.007.000.000.0023.004.002.009.002.0037.003.002.000.006.0042.003.005.001.007.0051.005.009.004.007.00# 2.1 使用 apply函数 :这时,该函数只能作用于某列,#如果没有指定某列,直接作用在数据框就会报错。
data_test.A.apply(format)15.0023.0037.0042.0051.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 043 A 35
B
key data1 data2
1 B 114 B 45
C
key data1 data2
2 C 225 C 54# 一、使用apply聚合 sum函数,max函数,min函数
grouped.apply(sum)
key data1 data2
key
A AA 38
B BB 57
C CC 712# 二、使用agg聚合
grouped.agg(sum)
data1 data2
key
A 39
B 56
C 76# 三、使用 transform 聚合
data1 data2
03815727123384575712
总结:
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 maxmin median max
key
A 01.5334.05
B 12.5403.57
C 23.5536.09
data1 data2
key
A 05
B 15
C 24# 定义 一个处理分组数据的函数defsum_transform(grouped):
grouped['sum_data1']= grouped.data1.sum()
grouped['sum_data1']= grouped.data2.sum()return grouped
group.apply(sum_transform)# 总结:三个方法中,apply是最灵活的,但是对于分组数据的聚合,用agg是最方便的,对于分组转换和展开,transform是最方便的,各有所长。