Pandas中的分组级运算

一、数据转换

          使用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)

上述方法中常用的参数表示的含义如下:

  1. func:表示应用于某一行或某一列的函数。
  2. axis:表示函数操作的轴向,"0"或"index"表示将函数应用于列上,"1"或"columns"表示将函数应用于行上,默认为0。
  3. 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 呀,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习呀

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页