Pandas GroupBy Unstack

  • Post category:Python

下面就为您详细讲解Pandas GroupBy Unstack的完整攻略。

一、Pandas GroupBy

Pandas的GroupBy是一种非常方便的数据分组和汇总工具。通过GroupBy可以在数据上进行分割(通过某些参数)、应用(函数)和组合(合并结果)三个操作,它的操作模式非常相似于SQL中的分组操作,因此也被称为“分组分析”或“分组计算”。

1. GroupBy的基本语法

df.groupby(by, 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:是否将分组依据列作为索引,默认为True。
  • sort:是否对结果进行排序,默认为True。
  • group_keys:是否针对分组后的组进行索引,默认为True。
  • squeeze:如果分组后的组只有一组,是否返回DataFrame或Series对象。
  • observed:是否使用观察到的标签,即不考虑标签的缺失值。如果设置为True,则只使用观察到的标签进行分组。

2. GroupBy的常用函数

在GroupBy对象上可以使用很多函数进行聚合,其中一些常用的函数如下:

  • sum(): 求和
  • count(): 统计数量
  • mean(): 求平均值
  • median(): 求中位数
  • max(): 求最大值
  • min(): 求最小值
  • std(): 求标准差
  • var(): 求方差
  • aggregate(): 自定义聚合函数
  • transform(): 自定义对分组后的数据进行转换
  • apply(): 对分组后的数据进行任意操作

3. GroupBy的应用实例

下面通过一个实例来进行GroupBy的应用说明:

首先,在pandas中导入数据集:

import pandas as pd

data = pd.read_csv('https://raw.githubusercontent.com/justmarkham/DAT8/master/data/drinks.csv')
print(data.head())

输出结果如下:

            country  beer_servings  spirit_servings  wine_servings  total_litres_of_pure_alcohol      continent
0       Afghanistan              0                0              0                           0.0           Asia
1           Albania             89              132             54                           4.9         Europe
2           Algeria             25                0             14                           0.7         Africa
3           Andorra            245              138            312                          12.4         Europe
4            Angola            217               57             45                           5.9         Africa

数据集中包括每个国家的啤酒,烈酒和葡萄酒消费量,以及每年消费的总纯酒精量和所在的大陆。现在我们来统计每个大陆的啤酒,葡萄酒和烈酒的平均值和最大值:

grouped = data.groupby('continent')

print(grouped['beer_servings'].mean())
print(grouped['beer_servings'].max())

print(grouped['wine_servings'].mean())
print(grouped['wine_servings'].max())

print(grouped['spirit_servings'].mean())
print(grouped['spirit_servings'].max())

输出结果如下:

continent
Africa            61.471698
Asia              37.045455
Europe           193.777778
North America    145.434783
Oceania           89.687500
South America    175.083333
Name: beer_servings, dtype: float64
continent
Africa            376
Asia              247
Europe            361
North America     285
Oceania           306
South America     333
Name: beer_servings, dtype: int64
continent
Africa            16.264151
Asia               9.068182
Europe           142.222222
North America     24.521739
Oceania           35.625000
South America     62.416667
Name: wine_servings, dtype: float64
continent
Africa            233
Asia              123
Europe            370
North America     100
Oceania           212
South America     221
Name: wine_servings, dtype: int64
continent
Africa            16.339623
Asia              60.840909
Europe           132.555556
North America    165.739130
Oceania           58.437500
South America    114.750000
Name: spirit_servings, dtype: float64
continent
Africa            152
Asia              326
Europe            373
North America     438
Oceania           254
South America     302
Name: spirit_servings, dtype: int64

二、Pandas Unstack

Pandas Unstack是一种转换数据的操作,它可以将数据中的某个层次化索引“旋转”为列索引,从而进行更方便和有效的数据分析和汇总。如果数据中含有多个层次化索引,也可以使用多次Unstack操作来实现数据的“旋转”,而不仅限于单次Unstack操作。

1. Unstack的基本语法

DataFrame.unstack(level=-1, fill_value=None)

参数说明:

  • level:需要“旋转”的数据层次,默认值为-1,表示最后一层。
  • fill_value:如果某个索引值在原始数据中不存在,则使用该值进行填充。

2. Unstack的应用实例

首先,我们先想象一下这样一个例子:假设我们有多年的股票数据,其中包含了股票的时间、价格以及交易量。现在我们希望分析每年的股票平均价格和交易量,如何实现?

import pandas as pd

# 构造数据集
data_index = pd.MultiIndex.from_product([['2017', '2018', '2019'], ['Stock A', 'Stock B']])
data = pd.DataFrame({'price': [10, 20, 30, 40, 50, 60], 'volume': [100, 200, 300, 400, 500, 600]}, index=data_index)

# 输出原始数据集
print('原始数据集:\n', data)

# 分析每年的股票平均价格和交易量
grouped = data.groupby(level=0)
stock_mean = grouped.mean()

# 输出每年的平均价格和交易量
print('\n年度平均价格和交易量:\n', stock_mean)

# 将交易量按年份展开
unstacked_vol = stock_mean['volume'].unstack()

# 输出展开后的交易量
print('\n展开后的交易量:\n', unstacked_vol)

输出结果如下:

原始数据集:
              price  volume
2017 Stock A     10     100
     Stock B     20     200
2018 Stock A     30     300
     Stock B     40     400
2019 Stock A     50     500
     Stock B     60     600

年度平均价格和交易量:
       price  volume
2017     15     150
2018     35     350
2019     55     550

展开后的交易量:
       Stock A  Stock B
2017      150      200
2018      300      400
2019      500      600

从输出结果可以看出,我们成功实现了数据的“旋转”,并得到了每年的股票平均价格和交易量。