pivot 函数简介
Pandas 的 pivot 函数是一种数据重塑工具,它将数据从长格式转换为宽格式,通过指定的行、列和值来创建一个新的派生表(pivot table)。这种转换在数据汇总、数据探索和多维数据的分析中非常有用。
派生表(Pivot Table)的特点:
数据聚合:可以对数据进行聚合,如求和、平均、最大、最小等。
多维分析:允许你从多个维度分析数据。
灵活的索引:可以自定义索引(行)和列。
使用 pivot 函数的关键参数:
index:新 DataFrame 的索引(行标签)。
columns:新 DataFrame 的列标签。
values:要聚合的列的名称或位置。
aggfunc:聚合函数,默认为 mean,但可以指定其他函数,如 sum、min、max 等。
使用 pivot 的例子:
方法一 pd.pivot()
import numpy as np
import pandas as pd
df = pd.DataFrame(data = [{'类别': '黄水果', '水果': '香蕉', '反馈': '点赞', '数量': 14}, {'类别': '黄水果', '水果': '菠萝', '反馈': '点赞', '数量': 30}, {'类别': '黄水果', '水果': '柠檬', '反馈': '点赞', '数量': 50}, {'类别': '红水果', '水果': '草莓', '反馈': '点赞', '数量': 160}, {'类别': '红水果', '水果': '苹果', '反馈': '点赞', '数量': 6}, {'类别': '红水果', '水果': '樱桃', '反馈': '点赞', '数量': 8}, {'类别': '黄水果', '水果': '香蕉', '反馈': '投币', '数量': 7}, {'类别': '黄水果', '水果': '菠萝', '反馈': '投币', '数量': 15}, {'类别': '黄水果', '水果': '柠檬', '反馈': '投币', '数量': 25}, {'类别': '红水果', '水果': '草莓', '反馈': '投币', '数量': 80}, {'类别': '红水果', '水果': '苹果', '反馈': '投币', '数量': 3}, {'类别': '红水果', '水果': '樱桃', '反馈': '投币', '数量': 4}])
|
类别 |
水果 |
反馈 |
数量 |
0 |
黄水果 |
香蕉 |
点赞 |
14 |
1 |
黄水果 |
菠萝 |
点赞 |
30 |
2 |
黄水果 |
柠檬 |
点赞 |
50 |
3 |
红水果 |
草莓 |
点赞 |
160 |
4 |
红水果 |
苹果 |
点赞 |
6 |
5 |
红水果 |
樱桃 |
点赞 |
8 |
6 |
黄水果 |
香蕉 |
投币 |
7 |
7 |
黄水果 |
菠萝 |
投币 |
15 |
8 |
黄水果 |
柠檬 |
投币 |
25 |
9 |
红水果 |
草莓 |
投币 |
80 |
10 |
红水果 |
苹果 |
投币 |
3 |
11 |
红水果 |
樱桃 |
投币 |
4 |
df1 = pd.pivot(df, index=["类别", "水果"], columns="反馈", values="数量")
df2 = df1.reset_index()
反馈 |
|
投币 |
点赞 |
类别 |
水果 |
|
|
红水果 |
樱桃 |
4 |
8 |
|
苹果 |
3 |
6 |
|
草莓 |
80 |
160 |
黄水果 |
柠檬 |
25 |
50 |
|
菠萝 |
15 |
30 |
|
香蕉 |
7 |
14 |
反馈 |
类别 |
水果 |
投币 |
点赞 |
0 |
红水果 |
樱桃 |
4 |
8 |
1 |
红水果 |
苹果 |
3 |
6 |
2 |
红水果 |
草莓 |
80 |
160 |
3 |
黄水果 |
柠檬 |
25 |
50 |
4 |
黄水果 |
菠萝 |
15 |
30 |
5 |
黄水果 |
香蕉 |
7 |
14 |
df1 = pd.pivot(df, index=["类别", "水果"], columns="反馈", values="数量")
反馈 |
|
投币 |
点赞 |
类别 |
水果 |
|
|
红水果 |
樱桃 |
4 |
8 |
|
苹果 |
3 |
6 |
|
草莓 |
80 |
160 |
黄水果 |
柠檬 |
25 |
50 |
|
菠萝 |
15 |
30 |
|
香蕉 |
7 |
14 |
df1 = pd.pivot(df, index="反馈", columns=["类别", "水果"], values="数量")
类别 |
黄水果 |
|
|
红水果 |
|
|
水果 |
香蕉 |
菠萝 |
柠檬 |
草莓 |
苹果 |
樱桃 |
反馈 |
|
|
|
|
|
|
投币 |
7 |
15 |
25 |
80 |
3 |
4 |
点赞 |
14 |
30 |
50 |
160 |
6 |
8 |

方法二 df.unstack() 解套; 不堆叠;
# 以下未验证
# 可以看到上面这一步,就直接相当于df1.set_index(["类别", "水果"])["反馈"].unstack()
# 然后再手动rename_axis、再reset_index即可