详解Pandas groupby分组操作

groupby 是 pandas 中非常重要的操作之一,它是指将数据按照一定的条件分为若干组,对每组数据执行特定的操作,然后将结果汇总为新的 DataFrame 的过程。通常,groupby 操作包括以下三个步骤:

  1. 分割:按照一定的规则将数据分为若干组;
  2. 应用:对每组数据执行特定的操作,例如聚合、转换、过滤等;
  3. 合并:将执行操作后得到的结果合并为一个新的数据结构。

下面我们通过一些示例来详细介绍 groupby 的用法。

首先,我们创建一个包含人员信息的数据集:

import pandas as pd
import numpy as np

data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Emily', 'Frank', 'Grace', 'Henry', 'Ivan', 'Jack'],
        'Gender': ['F', 'M', 'M', 'M', 'F', 'M', 'F', 'M', 'M', 'M'],
        'Age': [25, 30, 35, 40, 45, 50, 55, 60, 65, 70],
        'City': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Beijing', 'Shanghai', 'Beijing', 'Shenzhen', 'Guangzhou', 'Shanghai'],
        'Salary': [5000, 8000, 6000, 7000, 9000, 5500, 7500, 6500, 7000, 10000]}
df = pd.DataFrame(data)
print(df)

输出结果如下:

      Name Gender  Age       City  Salary
0    Alice      F   25    Beijing    5000
1      Bob      M   30   Shanghai    8000
2  Charlie      M   35  Guangzhou    6000
3    David      M   40   Shenzhen    7000
4    Emily      F   45    Beijing    9000
5    Frank      M   50   Shanghai    5500
6    Grace      F   55    Beijing    7500
7    Henry      M   60   Shenzhen    6500
8     Ivan      M   65  Guangzhou    7000
9     Jack      M   70   Shanghai   10000

我们以此为例,对这组数据集进行groupby操作:

分组

对于 DataFrame,我们可以根据某一列或多列进行分组,例如按照城市进行分组:

grouped = df.groupby('City')
for name, group in grouped:
    print(name)
    print(group)

输出结果如下:

Beijing
    Name Gender  Age     City  Salary
0  Alice      F   25  Beijing    5000
4  Emily      F   45  Beijing    9000
6  Grace      F   55  Beijing    7500
Guangzhou
      Name Gender  Age       City  Salary
2  Charlie      M   35  Guangzhou    6000
8     Ivan      M   65  Guangzhou    700

应用

在对分组后的数据进行操作之前,我们可以先对分组对象进行查看,例如查看每个组的大小:

grouped = df.groupby('City')
print(grouped.size())

输出结果如下:

City
Beijing      3
Guangzhou    2
Shanghai     3
Shenzhen     2
dtype: int64

我们可以使用聚合函数对每个组进行计算,例如计算每个城市的平均工资:

python
Copy code
grouped = df.groupby('City')
print(grouped['Salary'].mean())
输出结果如下:

City
Beijing      7166.666667
Guangzhou    6500.000000
Shanghai     7833.333333
Shenzhen     6750.000000
Name: Salary, dtype: float64

如果我们需要对每个组都执行多个聚合操作,可以使用 agg 方法:

grouped = df.groupby('City')
print(grouped['Salary'].agg([np.mean, np.median, np.std]))

输出结果如下:


                   mean  median          std
City                                        
Beijing     7166.666667    7500  2218.089987
Guangzhou   6500.000000    6500   707.106781
Shanghai    7833.333333    8000  2182.303656
Shenzhen    6750.000000    6750   353.553391

除了常用的聚合函数外,pandas 还提供了一些方便的函数,例如 size、first、last、nth 等。例如,我们可以使用 size 函数计算每个城市的人数:

grouped = df.groupby('City')
print(grouped.size())

输出结果如下:

City
Beijing      3
Guangzhou    2
Shanghai     3
Shenzhen     2
dtype: int64

合并

在对每个组进行操作后,我们可以使用 concat 或 merge 方法将结果合并为一个新的数据结构。例如,我们可以先计算每个城市的平均工资和人数,然后将它们合并为一个新的数据结构:

grouped = df.groupby('City')
result = pd.concat([grouped['Salary'].mean(), grouped.size()], axis=1)
result.columns = ['mean_salary', 'count']
print(result)

输出结果如下:


           mean_salary  count
City                         
Beijing    7166.666667      3
Guangzhou  6500.000000      2
Shanghai   7833.333333      3
Shenzhen   6750.000000      2

groupby 是 pandas 中非常重要的操作之一,它可以实现分组、聚合和合并等功能。熟练掌握 groupby 操作可以大大提高数据分析的效率。

本文链接:https://my.lmcjl.com/post/20029.html

展开阅读全文

4 评论

留下您的评论.