下面就为您详细讲解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
从输出结果可以看出,我们成功实现了数据的“旋转”,并得到了每年的股票平均价格和交易量。