Pandas如何使用GroupBy分组

发布时间:2021-11-30 10:08:47 作者:小新
来源:亿速云 阅读:220

Pandas如何使用GroupBy分组

引言

在数据分析和处理中,分组操作是非常常见的需求。Pandas作为Python中最流行的数据处理库之一,提供了强大的GroupBy功能,能够帮助我们轻松地对数据进行分组、聚合和转换。本文将详细介绍如何使用Pandas的GroupBy功能,包括基本用法、常见操作、以及一些高级技巧。

1. GroupBy的基本概念

GroupBy是Pandas中用于分组操作的核心功能。它允许我们根据某些条件将数据集分成多个组,然后对每个组进行聚合、转换或其他操作。GroupBy的基本流程可以分为以下三个步骤:

  1. 拆分(Split):根据某些条件将数据分成多个组。
  2. 应用(Apply):对每个组应用一个函数,如聚合、转换等。
  3. 合并(Combine):将应用函数后的结果合并成一个新的数据结构。

2. 创建示例数据

为了更好地理解GroupBy的使用,我们首先创建一个示例数据集。假设我们有一个包含销售数据的DataFrame,其中包括销售日期、销售员、产品类别和销售额等信息。

import pandas as pd

data = {
    'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-03', '2023-01-03'],
    'Salesperson': ['Alice', 'Bob', 'Alice', 'Bob', 'Alice', 'Bob'],
    'Product': ['A', 'B', 'A', 'B', 'A', 'B'],
    'Sales': [100, 150, 200, 250, 300, 350]
}

df = pd.DataFrame(data)
print(df)

输出结果:

         Date Salesperson Product  Sales
0  2023-01-01       Alice      A    100
1  2023-01-01         Bob      B    150
2  2023-01-02       Alice      A    200
3  2023-01-02         Bob      B    250
4  2023-01-03       Alice      A    300
5  2023-01-03         Bob      B    350

3. 基本分组操作

3.1 按单列分组

我们可以使用groupby()方法按某一列进行分组。例如,按Salesperson列分组:

grouped = df.groupby('Salesperson')

此时,grouped是一个DataFrameGroupBy对象,它包含了分组后的数据。我们可以通过groups属性查看每个组的具体内容:

print(grouped.groups)

输出结果:

{'Alice': [0, 2, 4], 'Bob': [1, 3, 5]}

3.2 按多列分组

我们也可以按多列进行分组。例如,按SalespersonProduct两列分组:

grouped = df.groupby(['Salesperson', 'Product'])
print(grouped.groups)

输出结果:

{('Alice', 'A'): [0, 2, 4], ('Bob', 'B'): [1, 3, 5]}

3.3 分组后的聚合操作

分组后,我们可以对每个组进行聚合操作。常见的聚合函数包括sum()mean()count()等。例如,计算每个销售员的总销售额:

total_sales = grouped['Sales'].sum()
print(total_sales)

输出结果:

Salesperson  Product
Alice        A         600
Bob          B         750
Name: Sales, dtype: int64

3.4 分组后的多个聚合操作

我们还可以对每个组进行多个聚合操作。例如,计算每个销售员的销售额总和、平均值和最大值:

agg_result = grouped['Sales'].agg(['sum', 'mean', 'max'])
print(agg_result)

输出结果:

                 sum   mean  max
Salesperson Product                    
Alice       A      600  200.0  300
Bob         B      750  250.0  350

4. 分组后的转换操作

除了聚合操作,我们还可以对分组后的数据进行转换操作。例如,计算每个销售员的销售额相对于其平均销售额的偏差:

def normalize(x):
    return x - x.mean()

df['Normalized Sales'] = grouped['Sales'].transform(normalize)
print(df)

输出结果:

         Date Salesperson Product  Sales  Normalized Sales
0  2023-01-01       Alice      A    100            -100.0
1  2023-01-01         Bob      B    150            -100.0
2  2023-01-02       Alice      A    200               0.0
3  2023-01-02         Bob      B    250               0.0
4  2023-01-03       Alice      A    300             100.0
5  2023-01-03         Bob      B    350             100.0

5. 分组后的过滤操作

我们还可以根据某些条件对分组后的数据进行过滤。例如,过滤出销售额总和大于600的组:

filtered = grouped.filter(lambda x: x['Sales'].sum() > 600)
print(filtered)

输出结果:

         Date Salesperson Product  Sales
1  2023-01-01         Bob      B    150
3  2023-01-02         Bob      B    250
5  2023-01-03         Bob      B    350

6. 分组后的迭代操作

我们可以通过迭代的方式访问每个分组的数据。例如,打印每个销售员的销售数据:

for name, group in grouped:
    print(f"Salesperson: {name}")
    print(group)
    print()

输出结果:

Salesperson: ('Alice', 'A')
         Date Salesperson Product  Sales
0  2023-01-01       Alice      A    100
2  2023-01-02       Alice      A    200
4  2023-01-03       Alice      A    300

Salesperson: ('Bob', 'B')
         Date Salesperson Product  Sales
1  2023-01-01         Bob      B    150
3  2023-01-02         Bob      B    250
5  2023-01-03         Bob      B    350

7. 分组后的多级索引

当我们按多列进行分组时,结果会生成一个多级索引(MultiIndex)。我们可以使用reset_index()方法将多级索引转换为普通列:

result = grouped['Sales'].sum().reset_index()
print(result)

输出结果:

  Salesperson Product  Sales
0       Alice      A    600
1         Bob      B    750

8. 分组后的透视表

GroupBy功能还可以与pivot_table()方法结合使用,生成透视表。例如,生成一个按销售员和产品类别分类的销售额透视表:

pivot_table = df.pivot_table(index='Salesperson', columns='Product', values='Sales', aggfunc='sum')
print(pivot_table)

输出结果:

Product        A    B
Salesperson          
Alice        600  NaN
Bob          NaN  750

9. 分组后的自定义函数

我们还可以在分组后应用自定义函数。例如,计算每个销售员的销售额相对于其最大销售额的百分比:

def percentage_of_max(x):
    return x / x.max() * 100

df['Percentage of Max Sales'] = grouped['Sales'].transform(percentage_of_max)
print(df)

输出结果:

         Date Salesperson Product  Sales  Percentage of Max Sales
0  2023-01-01       Alice      A    100                 33.333333
1  2023-01-01         Bob      B    150                 42.857143
2  2023-01-02       Alice      A    200                 66.666667
3  2023-01-02         Bob      B    250                 71.428571
4  2023-01-03       Alice      A    300                100.000000
5  2023-01-03         Bob      B    350                100.000000

10. 分组后的时间序列操作

如果数据中包含时间序列信息,我们还可以按时间进行分组。例如,按月份对销售额进行分组:

df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
monthly_sales = df.groupby(pd.Grouper(freq='M'))['Sales'].sum()
print(monthly_sales)

输出结果:

Date
2023-01-31    1350
Freq: M, Name: Sales, dtype: int64

11. 分组后的多重聚合

我们还可以对不同的列应用不同的聚合函数。例如,计算每个销售员的销售额总和和产品数量的平均值:

agg_result = df.groupby('Salesperson').agg({
    'Sales': 'sum',
    'Product': 'count'
})
print(agg_result)

输出结果:

            Sales  Product
Salesperson                
Alice          600        3
Bob            750        3

12. 分组后的排序

我们可以对分组后的结果进行排序。例如,按销售额总和降序排列:

sorted_result = df.groupby('Salesperson')['Sales'].sum().sort_values(ascending=False)
print(sorted_result)

输出结果:

Salesperson
Bob      750
Alice    600
Name: Sales, dtype: int64

13. 分组后的多重索引操作

当我们按多列进行分组时,结果会生成一个多重索引。我们可以使用unstack()方法将多重索引转换为列:

result = df.groupby(['Salesperson', 'Product'])['Sales'].sum().unstack()
print(result)

输出结果:

Product        A    B
Salesperson          
Alice        600  NaN
Bob          NaN  750

14. 分组后的多重索引排序

我们还可以对多重索引进行排序。例如,按销售员和产品类别进行排序:

sorted_result = df.groupby(['Salesperson', 'Product'])['Sales'].sum().sort_index(level=[0, 1])
print(sorted_result)

输出结果:

Salesperson  Product
Alice        A         600
Bob          B         750
Name: Sales, dtype: int64

15. 分组后的多重索引筛选

我们可以对多重索引进行筛选。例如,筛选出产品类别为A的销售数据:

filtered_result = df.groupby(['Salesperson', 'Product'])['Sales'].sum().xs('A', level='Product')
print(filtered_result)

输出结果:

Salesperson
Alice    600
Name: Sales, dtype: int64

16. 分组后的多重索引重置

我们可以使用reset_index()方法将多重索引转换为普通列:

result = df.groupby(['Salesperson', 'Product'])['Sales'].sum().reset_index()
print(result)

输出结果:

  Salesperson Product  Sales
0       Alice      A    600
1         Bob      B    750

17. 分组后的多重索引透视表

我们可以使用pivot_table()方法生成多重索引的透视表。例如,生成一个按销售员和产品类别分类的销售额透视表:

pivot_table = df.pivot_table(index='Salesperson', columns='Product', values='Sales', aggfunc='sum')
print(pivot_table)

输出结果:

Product        A    B
Salesperson          
Alice        600  NaN
Bob          NaN  750

18. 分组后的多重索引自定义函数

我们还可以在多重索引的分组后应用自定义函数。例如,计算每个销售员的销售额相对于其最大销售额的百分比:

def percentage_of_max(x):
    return x / x.max() * 100

df['Percentage of Max Sales'] = df.groupby(['Salesperson', 'Product'])['Sales'].transform(percentage_of_max)
print(df)

输出结果:

         Date Salesperson Product  Sales  Percentage of Max Sales
0  2023-01-01       Alice      A    100                 33.333333
1  2023-01-01         Bob      B    150                 42.857143
2  2023-01-02       Alice      A    200                 66.666667
3  2023-01-02         Bob      B    250                 71.428571
4  2023-01-03       Alice      A    300                100.000000
5  2023-01-03         Bob      B    350                100.000000

19. 分组后的多重索引时间序列操作

如果数据中包含时间序列信息,我们还可以按时间进行多重索引分组。例如,按月份和销售员对销售额进行分组:

df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
monthly_sales = df.groupby([pd.Grouper(freq='M'), 'Salesperson'])['Sales'].sum()
print(monthly_sales)

输出结果:

Date        Salesperson
2023-01-31  Alice          600
            Bob            750
Freq: M, Name: Sales, dtype: int64

20. 分组后的多重索引多重聚合

我们还可以对多重索引的分组后的数据进行多重聚合。例如,计算每个销售员的销售额总和和产品数量的平均值:

agg_result = df.groupby(['Salesperson', 'Product']).agg({
    'Sales': 'sum',
    'Product': 'count'
})
print(agg_result)

输出结果:

                 Sales  Product
Salesperson Product                
Alice        A         600        3
Bob          B         750        3

21. 分组后的多重索引排序

我们可以对多重索引的分组后的结果进行排序。例如,按销售额总和降序排列:

sorted_result = df.groupby(['Salesperson', 'Product'])['Sales'].sum().sort_values(ascending=False)
print(sorted_result)

输出结果:

Salesperson  Product
Bob          B         750
Alice        A         600
Name: Sales, dtype: int64

22. 分组后的多重索引多重索引操作

我们可以使用unstack()方法将多重索引转换为列:

result = df.groupby(['Salesperson', 'Product'])['Sales'].sum().unstack()
print(result)

输出结果:

Product        A    B
Salesperson          
Alice        600  NaN
Bob          NaN  750

23. 分组后的多重索引多重索引排序

我们还可以对多重索引进行排序。例如,按销售员和产品类别进行排序:

sorted_result = df.groupby(['Salesperson', 'Product'])['Sales'].sum().sort_index(level=[0, 1])
print(sorted_result)

输出结果:

Salesperson  Product
Alice        A         600
Bob          B         750
Name: Sales, dtype: int64

24. 分组后的多重索引多重索引筛选

我们可以对多重索引进行筛选。例如,筛选出产品类别为A的销售数据:

filtered_result = df.groupby(['Salesperson', 'Product'])['Sales'].sum().xs('A', level='Product')
print(filtered_result)

输出结果:

Salesperson
Alice    600
Name: Sales, dtype: int64

25. 分组后的多重索引多重索引重置

我们可以使用reset_index()方法将多重索引转换为普通列:

result = df.groupby(['Salesperson', 'Product'])['Sales'].sum().reset_index()
print(result)

输出结果:

  Salesperson Product  Sales
0       Alice      A    600
1         Bob      B    750

26. 分组后的多重索引多重索引透视表

我们可以使用pivot_table()方法生成多重索引的透视表。例如,生成一个按销售员和产品类别分类的销售额透视表:

pivot_table = df.pivot_table(index='Salesperson', columns='Product', values='Sales', aggfunc='sum')
print(pivot_table)

输出结果:

Product        A    B
Salesperson          
Alice        600  NaN
Bob          NaN  750

27. 分组后的多重索引多重索引自定义函数

我们还可以在多重索引的分组后应用自定义函数。例如,计算每个销售员的销售额相对于其最大销售额的百分比:

def percentage_of_max(x):
    return x / x.max() * 100

df['Percentage of Max Sales'] = df.groupby(['Salesperson', 'Product'])['Sales'].transform(percentage_of_max)
print(df)

输出结果:

         Date Salesperson Product  Sales  Percentage of Max Sales
0  2023-01-01       Alice      A    100                 33.333333
1  2023-01-01         Bob      B    150                 42.857143
2  2023-01-02       Alice      A    200                 66.666667
3  2023-01-02         Bob      B    250                 71.428571
4  2023-01-03       Alice      A    300                100.000000
5  2023-01-03         Bob      B    350                100.000000

28. 分组后的多重索引多重索引时间序列操作

如果数据中包含时间序列信息,我们还可以按时间进行多重索引分组。例如,按月份和销售员对销售额进行分组:

df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
monthly_sales = df.groupby([pd.Grouper(freq='M'), 'Salesperson'])['Sales'].sum()
print(monthly_sales)

输出结果:

Date        Salesperson
2023-01-31  Alice          600
            Bob            750
Freq: M, Name: Sales, dtype: int64

29. 分组后的多重索引多重索引多重聚合

我们还可以对多重索引的分组后的数据进行多重聚合。例如,计算每个销售员的销售额总和和产品数量的平均值:

agg_result = df.groupby(['Salesperson', 'Product']).agg({
    'Sales': 'sum',
    'Product': 'count'
})
print(agg_result)

输出结果:

                 Sales  Product
Salesperson Product                
Alice        A         600        3
Bob          B         750        3

30. 分组后的多重索引多重

推荐阅读:
  1. groupby( )函数怎么在Pandas中使用
  2. 如何使用Pandas和Numpy按时间戳将数据以Groupby方式分组

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

pandas groupby

上一篇:如何使用DDL实现SQL数据表层面操作

下一篇:C/C++ Qt TreeWidget单层树形组件怎么应用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》