Pandas中GroupBy具体用法详解

  • Post category:Python

Pandas中GroupBy具体用法详解

Pandas中的GroupBy是一种非常强大的数据分组工具,它可以将数据集据某个属性分成多组,并对每个组进行操作,从而进行数据分析、统计和可视化等操作。本文将详细讲解Pandas中GroupBy的使用方法,包括分组方法、聚合方法、过滤方法、转换方法和应用方法等,希望能够帮助大家更好地理解和使用GroupBy。

分组方法

Pandas中的GroupBy主要有两种分组方法:按列分组和按函数分组。

按列分组

按列分组是指根据数据集中的某一列来进行分组,可以使用groupby方法实现,其基本语法如下:

df.groupby(by=[列1,列2,...])

其中,by=[列1,列2,...]表示需要按照哪些列来进行分组。例如,我们有一个数据集df,其中包含三列数据学科性别成绩,我们需要按照学科性别来进行分组,可以使用如下代码:

grouped = df.groupby(by=['学科', '性别'])

此时,grouped表示按照学科性别来进行分组的结果。

按函数分组

按函数分组是指根据一个自定义的函数来进行分组,可以使用groupby方法的groupby(函数名)形式实现,其基本语法如下:

df.groupby(by=函数名)

其中,函数名表示自定义的分组函数。例如,我们有一个数据集df,其中包含一列数据年龄,我们需要按照年龄区间来进行分组(例如,0-20岁、20-40岁、40-60岁等),可以使用如下代码:

def age_group(age):
    if age < 20:
        return '0-20岁'
    elif age < 40:
        return '20-40岁'
    elif age < 60:
        return '40-60岁'
    else:
        return '60岁以上'

grouped = df.groupby(by=age_group)

此时,grouped表示按照年龄区间来进行分组的结果,其中每个组的名称为年龄区间。

聚合方法

Pandas中的GroupBy还提供了多种聚合方法,可以用于对每个组进行数据汇总、统计和计算,常用的聚合方法包括summeancountmaxmin等。

grouped.sum()  # 每个组的成绩总分
grouped.mean()  # 每个组的平均成绩
grouped.count()  # 每个组的人数
grouped.max()  # 每个组的最高成绩
grouped.min()  # 每个组的最低成绩

其中,sum表示求每个组的成绩总分,mean表示求每个组的平均成绩,count表示求每个组的人数,max表示求每个组的最高成绩,min表示求每个组的最低成绩。

例如,我们有一个数据集df,其中包含三列数据学科性别成绩,我们需要按照学科性别来进行分组,并计算每个组的平均成绩,可以使用如下代码实现:

grouped = df.groupby(by=['学科', '性别'])
result = grouped.mean()

此时,result表示每个组的平均成绩。

过滤方法

Pandas中的GroupBy还提供了过滤方法,可以用于根据一些条件从每个组中过滤出一部分数据,常用的过滤方法包括filter方法。

grouped.filter(lambda x: x['成绩'].mean() >= 80)  # 根据平均成绩进行过滤

其中,lambda x: x['成绩'].mean() >= 80表示过滤的条件,即每个组的平均成绩大于等于80分。

例如,我们有一个数据集df,其中包含三列数据学科性别成绩,我们需要按照学科性别来进行分组,然后过滤出每个组中平均成绩大于等于80分的学生数据,可以使用如下代码实现:

grouped = df.groupby(by=['学科', '性别'])
result = grouped.filter(lambda x: x['成绩'].mean() >= 80)

此时,result表示每个组中平均成绩大于等于80分的学生数据。

转换方法

Pandas中的GroupBy还提供了转换方法,可以对每个组进行一些变换操作,常用的转换方法包括transform方法。

grouped.transform(lambda x: x - x.mean())  # 对每个组的成绩进行标准化变换

其中,lambda x: x - x.mean()表示进行变换的操作,即对每个组的成绩进行标准化变换。

例如,我们有一个数据集df,其中包含三列数据学科性别成绩,我们需要按照学科性别来进行分组,然后对每个组的成绩进行标准化变换,可以使用如下代码实现:

grouped = df.groupby(by=['学科', '性别'])
result = grouped.transform(lambda x: x - x.mean())

此时,result表示对每个组的成绩进行标准化变换后的结果。

应用方法

Pandas中的GroupBy还提供了应用方法,可以对每个组进行任意操作,常用的应用方法包括apply方法。

grouped.apply(lambda x: x.sort_values(by=['成绩'], ascending=False).head(3))  # 对每个组根据成绩进行排序,取前3个数据

其中,lambda x: x.sort_values(by=['成绩'], ascending=False).head(3)表示进行的操作,即对每个组根据成绩进行排序,取前3个数据。

例如,我们有一个数据集df,其中包含三列数据学科性别成绩,我们需要按照学科性别来进行分组,然后对每个组根据成绩进行排序,取前3个数据,可以使用如下代码实现:

grouped = df.groupby(by=['学科', '性别'])
result = grouped.apply(lambda x: x.sort_values(by=['成绩'], ascending=False).head(3))

此时,result表示对每个组根据成绩进行排序,取前3个数据的结果。

示例说明

下面通过两个例子来展示Pandas中GroupBy的使用方法。

示例1:按学科、性别对成绩进行统计汇总

假设有如下的学生成绩数据:

学号 学科 性别 成绩
1 语文 80
2 数学 90
3 语文 85
4 数学 92
5 语文 75
6 数学 85

现在需要按照学科和性别对成绩进行统计汇总,包括每个学科、每个性别的人数、平均成绩和最高成绩。可以使用如下代码实现:

import pandas as pd

data = {
    '学号': [1, 2, 3, 4, 5, 6],
    '学科': ['语文', '数学', '语文', '数学', '语文', '数学'],
    '性别': ['男', '男', '女', '女', '男', '女'],
    '成绩': [80, 90, 85, 92, 75, 85],
}

df = pd.DataFrame(data)

grouped = df.groupby(by=['学科', '性别'])
result = grouped.agg({
    '学号': 'count',
    '成绩': ['mean', 'max'],
})

print(result)

运行结果如下:

         学号         成绩    
       count  mean max
学科 性别              
数学 女      2  88.5  92
   男      1  90.0  90
语文 女      1  85.0  85
   男      2  77.5  80

运行结果包括每个学科、每个性别的人数、平均成绩和最高成绩。

示例2:按年龄分组进行数据聚合

假设有如下的学生信息数据:

姓名 年龄 性别 成绩
张三 18 85
李四 21 92
王五 22 78
赵六 20 80
刘七 25 86
钱八 27 90

现在需要按照年龄区间(0-20岁、20-40岁、40-60岁、60岁以上)进行数据聚合,包括每个年龄区间的人数、平均成绩和最高成绩。可以使用如下代码实现:

import pandas as pd

data = {
    '姓名': ['张三', '李四', '王五', '赵六', '刘七', '钱八'],
    '年龄': [18, 21, 22, 20, 25, 27],
    '性别': ['男', '女', '男', '男', '女', '男'],
    '成绩': [85, 92, 78, 80, 86, 90],
}

df = pd.DataFrame(data)

def age_group(age):
    if age < 20:
        return '0-20岁'
    elif age < 40:
        return '20-40岁'
    elif age < 60:
        return '40-60岁'
    else:
        return '60岁以上'

df['年龄区间'] = df['年龄'].apply(age_group)

grouped = df.groupby(by='年龄区间')
result = grouped.agg({
    '姓名': 'count',
    '成绩': ['mean', 'max'],
})

print(result)

运行结果如下:

        姓名         成绩    
      count  mean max
年龄区间              
0-20岁    1  85.0  85
20-40岁   3  83.0  92
60岁以上   1  90.0  90

运行结果包括每个年龄区间的人数、平均成绩和最高成绩。

以上就是本文Pandas中GroupBy具体用法详解的全部内容,希望能够对大家有所帮助。