📜  Python|熊猫 dataframe.groupby()(1)

📅  最后修改于: 2023-12-03 15:34:20.163000             🧑  作者: Mango

Python | 熊猫 dataframe.groupby()

介绍

DataFrame.groupby() 方法允许您根据一个或多个键(这可以是函数、数组或 dataframe 列)来分割 dataframe 并应用聚合函数。

在 pandas 中,groupby() 是一个核心函数,最常用于三个步骤:

  1. 拆分:根据特定的条件将数据拆分成多个组;
  2. 应用:将函数应用到条件下的数据组;
  3. 组合:将结果合并为一个数据结构。
语法
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)

其中,参数如下:

  • by: 拆分条件,可以是单个列标签、多个列标签、函数,等等。
  • axis: 拆分方向,可为 0 或 1,默认为 0;
  • level: 如果轴是多层索引(即,由多个等级组成),则沿着特定级别进行分组,否则按照所有级别分组;
  • as_index: 是否将分组列作为索引;
  • sort: 按照分组列排序;
  • group_keys: 是否在结果中包含 grouper 信息;
  • squeeze: 如果可以连接,则返回名称,在axis上仅有一个分组的对象(即,如果对唯一分组或拆分列仅仅有一个项目);
  • observed: 如果将要拆分的观察值中包含所有的组,则为 True。如果现在的组不是所有的组,那么观察值会缩小,也就是说,观察值将忽略不存在的组。

如果 as_index=True(默认值),则分组键将成为结果 dataframe 的索引。如果 as_index=False,则分组键不会成为结果索引,而是用排名分配新的行索引。

例子
分组一个列

假设我们有一个数据集,包含某个地区月份和该月销售额的信息。我们想要从中获取每个地区的销售总额。首先,我们可以将数据按照区域进行分组,然后对每个区域的销售额求和。

import pandas as pd

data = {
    'Region': ['South', 'South', 'North', 'North', 'East', 'West', 'East', 'West'],
    'Month': ['January', 'February', 'January', 'February', 'January', 'January', 'February', 'February'],
    'Sales': [5000, 5500, 6000, 5900, 7000, 8000, 9000, 8500]
}

df = pd.DataFrame(data)
result = df.groupby(['Region']).sum()

print(result)

结果如下所示:

        Sales
Region       
East    16000
North   11900
South   10500
West    16500

在上面的代码中,我们使用了 groupby 函数将数据按照 Region 分组,然后将 Sales 列数据求和。

分组多个列

除了单个列以外,我们还可以按照多个列来分组数据。假设我们有一个数据集,包含某个商店每个月每个地区所销售的几种不同商品的数量。我们想按照商品类型,地区和月份来分组数据,并计算每个分组中不同商品的销售总数和平均数量。

import pandas as pd

data = {
    'Region': ['South', 'South', 'North', 'North', 'East', 'West', 'East', 'West'],
    'Month': ['January', 'February', 'January', 'February', 'January', 'January', 'February', 'February'],
    'Product': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
    'Quantity': [100, 120, 130, 140, 110, 90, 80, 70]
}

df = pd.DataFrame(data)
result = df.groupby(['Region', 'Month', 'Product']).agg({'Quantity': ['sum', 'mean']})

print(result)

结果如下所示:

                      Quantity      
                           sum  mean
Region Month   Product              
East   February A           80  80.0
               B           70  70.0
       January  A          110  55.0
North  February A          140  70.0
               B          140  70.0
       January  A          130  65.0
               B          140  70.0
South  February B          120 120.0
       January  A          100 100.0

在上面的代码中,我们使用了 groupby 函数来按照 RegionMonthProduct 来分组数据。然后,我们使用了 agg 函数来计算不同商品的销售总数和平均数量。

分组后可视化

分组后的数据可以进行多种可视化操作,例如画图。假设我们有一个数据集,其中包含某个城市每个月的气温和降雨量。现在我们想要绘制每个月的平均气温和降雨量(按季节区分)。

import pandas as pd
import matplotlib.pyplot as plt

data = {
    'Month': ['January', 'February', 'March', 'April', 'May', 'June',  'July', 'August', 'September', 'October', 'November', 'December'],
    'Temperature': [17, 19, 22, 26, 30, 33, 33, 33, 31, 28, 23, 19],
    'Rainfall': [9, 12, 20, 48, 143, 210, 263, 222, 160, 60, 18, 9],
}

df = pd.DataFrame(data)
df['Season'] = df['Month'].replace(
    ['January', 'February', 'December'], 'Winter'
).replace(
    ['March', 'April', 'May'], 'Spring'
).replace(
    ['June', 'July', 'August'], 'Summer'
).replace(
    ['September', 'October', 'November'], 'Autumn'
)

result = df.groupby('Season').mean()[['Temperature', 'Rainfall']]
result.plot(kind='bar')
plt.xlabel('Season')
plt.ylabel('Average Temperature (°C) / Rainfall (mm)')
plt.title('Seasonal Climate')
plt.show()

运行上述代码将生成以下柱状图:

Seasonal Climate

在上面的代码中,我们使用了 groupby 函数来将数据按照 Season 分组,并计算每个组中的平均气温和降雨量。然后,我们使用了 plot 函数来绘制柱状图。