Python之Pandas学习笔记(三) apply|applymap|map和grouppy

一、apply|applymap|map 异同分析

分类applyapplymapmap
作用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是最方便的,各有所长。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值