一、数据转换
使用agg()方法进行聚合运算时,返回的数据集的形状(shape)与被分组数据集的形状是不一样的,如果希望保持与原数据集形状相同,那么可以通过transfrom()方法实现。transfrom方法的语法格式如下:
transfrom(func,*args,**kwargs)
上述方法中只有一个参数func参数,表示操作Pandas对象的函数。transfrom()方法返回的结果有两种:一种是可以广播的标量值(np.mean);另一种可以是与分组大小相同的结果数组。通过transfrom()方法操作分组时,transfrom()方法会把func()函应用到各个分组中,并且将结果放在适当的位置上。
接下来通过代码演示:
import pandas as pd
df=pd.DataFrame({'a':[0,1,6,10,3]
,'b':[1,2,7,11,4]
,'c':[2,3,8,12,4]
,'d':[3,4,9,13,5]
,'e':[4,5,10,14,3]
,'key':['A','A','B','B','B']})
df
data_group=df.groupby('key').mean() #agg()进行聚合运算的时候,返回的数据集的形状与被分组数据集的形状不一样
data_group
data_group=df.groupby('key').transform('mean') #用 transform 可以实现聚合运算时,返回的数据集的形状与被分组数据集的形状一样
data_group
如果希望进行转换后,返回具有相同形状的结果,那么可以创建一个Series对象,该对象的长度与表格的行数是相同的,按照这个Series对象进行分组,便可以得到一个形状相同的对象。代码如下:
import pandas as pd
df=pd.DataFrame({'A':[2,3,3,4,2]
,'B':[4,2,3,6,6]
,'C':[9,7,0,7,8]
,'D':[3,4,8,6,10]})
df
key=['one','one','two','two','two']
df.groupby(key).mean()
key=['one','one','two','two','two'] # Key的定义随便的,主要是和 df 对象的行数是一样的就行
df.groupby(key).transform('mean')
通过比较转换前与转换后的结果,发现两次输出的结果具有相同的大小。在这里,计算出的平均值不仅在每组每列中进行了广播,而且也保证了返回的结果与原数据的形状相同。
二、数据应用
当某些分组操作,既不适合使用agg()方法进行聚合,也不适合使用transfrom()方法进行转换时,便可以让apply()方法排上用场了。apply()方法的使用十分灵活,它可以作用于DataFrame中每一行、每一列元素,它还可以在许多标准用例中替代聚合和转换。
apply()方法的语法格式如下:
apply(func,axis=0,broadcast=None,raw=False,reduce=None,result_type=None,args=(),**kwds)
上述方法中常用的参数表示的含义如下:
- func:表示应用于某一行或某一列的函数。
- axis:表示函数操作的轴向,"0"或"index"表示将函数应用于列上,"1"或"columns"表示将函数应用于行上,默认为0。
- broadcast:表示是否将数据进行广播。若设为False或None,则会返回一个Series对象,其长度跟索引的长度或列数一样;若设为True,则表示结果被广播到原始对象中,原始的索引和列将会保留。
接下来通过代码演示:
import pandas as pd
import numpy as np
data=pd.DataFrame({'data1':[80,23,56,95]
,'data2':[50,68,98,54]
,'data3':[78,58,94,45]
,'key':list('baab')})
data
data_by_group=data.groupby('key')
dict([x for x in data_by_group])['a']
dict([x for x in data_by_group])['b']
def plus_ten(data):
return data.iloc[:,:3]+10
data_by_group.apply(plus_ten)
作者:KJ.JK
本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。
文章对你有所帮助的话,欢迎给个赞或者 star 呀,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习呀