您的位置:

pandas groupby 用法详解

pandas 是一个用于数据处理和分析的 Python 库,由于其强大而简单的功能,已经成为了数据科学家和分析师的首选库之一。在 pandas 中,groupby 是一个非常重要的函数,它可以帮助我们对数据进行分组和聚合。本文将详细介绍 pandas groupby 函数的各种用法。

一、分组(Grouping)

groupby函数是将数据按照一定规则分成一组的工具。其基本语法如下:


grouped = df.groupby(key)

其中,key是指按照哪个列进行分组。groupby函数返回的是按照指定列分组后的一个groupby对象。我们可以通过如下代码观察分组的结果:


import pandas as pd

data = {'Name': ['Mike', 'Bob', 'Alex', 'Alice', 'Bruce', 'Bob'],
        'Gender': ['M', 'M', 'M', 'F', 'M', 'M'],
        'City': ['Beijing', 'Shanghai', 'Shanghai', 'Beijing','Beijing', 'Shanghai'],
        'Salary': [10000, 30000, 20000, 15000, 25000, 15000]
        }

df = pd.DataFrame(data)

grouped = df.groupby('City')

for name, group in grouped:
    print(name)
    print(group)
    print("---------")

运行以上代码,输出结果如下:

Beijing
    Name Gender     City  Salary
0   Mike      M  Beijing   10000
3  Alice      F  Beijing   15000
4  Bruce      M  Beijing   25000
---------
Shanghai
   Name Gender      City  Salary
1   Bob      M  Shanghai   30000
2  Alex      M  Shanghai   20000
5   Bob      M  Shanghai   15000
---------

该结果表明,我们按照城市对数据进行了分组,然后将分组结果依次输出。

二、聚合(Aggregation)

在分组完成之后,我们可能需要对每一个组进行聚合操作。在 pandas 中,有多种聚合函数可供选择。比如:

  • mean:计算组的平均值
  • sum:计算组的总和
  • size:计算组的大小
  • max:计算组的最大值
  • min:计算组的最小值
  • std:计算组的标准差
  • var:计算组的方差

我们可以使用这些聚合函数来对每一个组进行聚合操作。其基本语法如下:


grouped = df.groupby(key)
grouped.agg(func)

其中,func是我们想要对组进行的聚合操作,可以是mean、sum、size等。

下面是一些代码示例:


# 按城市计算平均薪资
grouped = df.groupby('City')
grouped['Salary'].mean()
# 输出结果如下
# City
# Beijing     16666.666667
# Shanghai    21666.666667
# Name: Salary, dtype: float64

# 按城市和性别计算平均薪资和总薪资
grouped = df.groupby(['City', 'Gender'])
grouped['Salary'].agg([np.mean, np.sum])
# 输出结果如下
#                     mean    sum
# City     Gender
# Beijing  F        15000  15000
#          M        17500  35000
# Shanghai M        18750  37500

三、迭代(Iteration)

通过 groupby 函数分组后,我们可以使用其迭代功能来遍历每一个分组。其基本语法如下:


for name, group in grouped:
    # 对每一个分组进行操作

其中,name是指分组的名称,group是指对应分组的 DataFrame。

例如,我们可以按城市分组并遍历每一个分组,输出平均薪资:


grouped = df.groupby('City')

for name, group in grouped:
    print(name)
    print(group['Salary'].mean())
    print("---------")

输出结果如下:

Beijing
16666.666666666668
---------
Shanghai
21666.666666666668
---------

四、过滤(Filtering)

我们可以使用 filter 函数筛选出符合条件的数据。其基本语法如下:


grouped = df.groupby(key)
grouped.filter(func)

其中,func是一个函数,用来判断某一行是否符合条件。

例如,我们可以按城市分组,然后筛选出平均薪资高于20000的行:


grouped = df.groupby('City')
grouped.filter(lambda x: x['Salary'].mean() > 20000)
# 输出结果如下
#     Name Gender      City  Salary
# 1    Bob      M  Shanghai   30000
# 2   Alex      M  Shanghai   20000
# 4  Bruce      M   Beijing   25000

五、转换(Transforming)

Transforming 操作是指对每一个分组进行独立的操作,且该操作生成的结果的行列数与原来的 DataFrame 相同。其基本语法如下:


grouped = df.groupby(key)
grouped.transform(func)

其中,func是一个函数,用来对每一个分组进行操作。

例如,我们可以按城市分组,然后对每一个分组进行标准化处理:


grouped = df.groupby('City')
score = lambda x: (x - x.mean()) / x.std()
grouped.transform(score)
# 输出结果如下:
#     Salary
# 0 -1.135550
# 1  1.000000
# 2 -0.707107
# 3 -0.404520
# 4  0.707107
# 5 -0.450981

六、应用(Applying)

使用 apply 函数可以对整个 DataFrame 进行独立的操作,其可以返回任意形状的结果。其基本语法如下:


grouped = df.groupby(key)
grouped.apply(func)

其中,func是一个函数,用来对整个 DataFrame 进行操作。

例如,我们可以按城市分组,然后对每一个分组进行 t-检验:


import scipy.stats as stats

grouped = df.groupby('City')

def t_test(group):
    return stats.ttest_1samp(group['Salary'], 20000)

grouped.apply(t_test)
# 输出结果如下:
# City
# Beijing     0.670820
# Shanghai    1.000000
# 

该结果表明,北京的平均薪资显著低于20000,而上海的平均薪资则不显著低于20000。

结束语

pandas groupby 函数是 pandas 库中非常重要而实用的功能。通过本文的详细介绍,相信大家已经学会了如何对数据进行分组、聚合、迭代、筛选、转化和应用操作,这些操作都是非常有用且广泛使用的数据分析工具。