Press "Enter" to skip to content

Pandas数据分组groupby()和统计函数agg()的使用

数据分组

★ 使用 groupby() 方法进行分组
★ group.size()查看分组后每组的数量
★ group.groups 查看分组情况
★ group.get_group(“名字”) 根据分组后的名字选择分组数据

首先打开一份数据

使用 groupby() 方法进行分组


可以按 性别 进行分组,或者同时按 性别婚姻状况 来分组

使用groupby的size方法可以查看分组后每组的数量, 并返回一个含有分组大小的Series

按性别分组:假如我想看男的有多少人?女的有多少人?

import pandas as pd

pd.set_option('display.unicode.ambiguous_as_wide', True)  #处理数据的列标题与数据无法对齐的情况
pd.set_option('display.unicode.east_asian_width', True)   #无法对齐主要是因为列标题是中文

df=pd.read_excel(r'C:\Users\Administrator\Desktop\python练习\xbx_stock_2019\People.xls',encoding='gbk')
df1=df.groupby('性别').size()
print(df1)

同时按 性别 和 婚姻状况 分组:

df.groupby(['性别','婚姻状况']).size()

对分组进行遍历


将分组后的对象进行遍历,可以获取到每个组的名字以及每个组的数据

例如我将上面的数据按照 性别 分组,它返回的是一个对象,结果是这样的:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000000028FCBE0>

我们看不到里面的内容,如果想要里面有什么内容可以使用for循环把里面的数据遍历出来

import pandas as pd

pd.set_option('display.unicode.ambiguous_as_wide', True)  #处理数据的列标题与数据无法对齐的情况
pd.set_option('display.unicode.east_asian_width', True)   #无法对齐主要是因为列标题是中文

df=pd.read_excel(r'C:\Users\Administrator\Desktop\python练习\xbx_stock_2019\People.xls',encoding='gbk')

group=df.groupby('性别')

for df_name,df_DataFrame in group:
    print(df_name)
    print(df_DataFrame)

这样就能看到分组后的对象信息了

现在我有一个这样的需求,我想知道,分组后,各组的年龄最大值、最小值和平均值,需要怎么做呢?

方法如下:

import pandas as pd

pd.set_option('display.unicode.ambiguous_as_wide', True)  #处理数据的列标题与数据无法对齐的情况
pd.set_option('display.unicode.east_asian_width', True)   #无法对齐主要是因为列标题是中文

df=pd.read_excel(r'C:\Users\Administrator\Desktop\python练习\xbx_stock_2019\People.xls',encoding='gbk')

group=df.groupby('性别')

for df_name,df_age in group:
    df_max=df_age['年龄'].max()
    df_min=df_age['年龄'].min()
    df_mean=df_age['年龄'].mean()
    print(f'{df_name}性的最大年龄是:{df_max},最小年龄是:{df_min},平均年龄是:{df_mean}')

Pandas 常用的统计函数


  • count() 统计列表中非空手机开的个数
  • nunique() 统计非重复的数据个数
  • sum() 统计列表中所有数值的和
  • mean() 计算列表中数据的平均值
  • median() 统计列表中数据中位数
  • max() 求列表中数据的最大值
  • min() 求列表中数据的最小值

对分组后的数据进行统计 agg()


agg()函数是聚合函数,它可以调用自定义的函数;对一列使用多个函数;对不同的列使用不同的函数。(用人话就是可以将多个统计函数一起放在一个 agg() 函数中)

还是拿上面的例子来演示一下:

import pandas as pd

pd.set_option('display.unicode.ambiguous_as_wide', True)  #处理数据的列标题与数据无法对齐的情况
pd.set_option('display.unicode.east_asian_width', True)   #无法对齐主要是因为列标题是中文

df=pd.read_excel(r'C:\Users\Administrator\Desktop\python练习\xbx_stock_2019\People.xls',encoding='gbk')

group=df.groupby('性别')

for df_name,df_age in group:
    result=df_age['年龄'].agg(['max','min','mean'])
    print(f'{df_name}性的最大年龄是:{result[0]},最小年龄是:{result[1]},平均年龄是:{result[2]}')

自定义统计函数


当使用自定义的统计函数时,先创建统计函数

import pandas as pd

pd.set_option('display.unicode.ambiguous_as_wide', True)  #处理数据的列标题与数据无法对齐的情况
pd.set_option('display.unicode.east_asian_width', True)   #无法对齐主要是因为列标题是中文

df=pd.read_excel(r'C:\Users\Administrator\Desktop\python练习\xbx_stock_2019\People.xls',encoding='gbk')

group=df.groupby('性别')

# 自定义的统计函数
def add(df):
    return df.max()-df.min() # 返回最大值与最小之间的范围

for df_name,df_age in group:
    result=df_age['年龄'].agg(['max','min','mean',add]) # 注意:自定义函数名字传入agg() 函数时, 不需要转换成字符串
    print(f'{df_name}性的最大年龄是:{result[0]},最小年龄是:{result[1]},平均年龄是:{result[2]},最大值与最小之间的范围:{result[3]}')

注意:自定义函数名字传入agg() 函数时, 不需要转换成字符串

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注