看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在 pandas 中,pivot 用于简单的数据重塑,不支持聚合且无法处理重复索引;pivot_table 更灵活,支持数据聚合和处理缺失值,适用于复杂的数据转换场景。通过本例,我们来看看 pivot_table 如何灵活应用解决疑难问题。
我们的数据如下:
import pandas as pd
import io
data = '''
x1 x2 x3 para value
A 0.1 1 g 1
A 0.1 1 g 2
A 0.1 1 d 3
A 0.1 1 d 4
A 0.1 1 s 5
A 0.1 1 s 6
B 0.2 1 g 1
B 0.2 1 g 2
B 0.2 1 d 3
B 0.2 1 d 4
B 0.2 1 s 5
B 0.2 1 s 6
'''
df = pd.read_csv(io.StringIO(data), sep=r'\s+')
df
# ...
要将数据的 x1 到 x3 为数据行,将 para 转为列进行透视,得到的结果如下:
'''
x1 x2 x3 g d s
A 0.1 1 1 3 5
A 0.1 1 2 4 6
B 0.2 1 1 3 5
B 0.2 1 2 4 6
'''
本需求看起来是一个简单的整理透视需求,我们只需要对数据的形状进行变化,并不会涉及对部分列的聚合计算,但是你如果编写以下代码会抛出错误:
df.pivot(index=['x1', 'x2', 'x3'],
columns='para',
values='value'
)
# ValueError: Index contains duplicate entries, cannot reshape
这是因为 index 给出的列中 x3 和 x2 有重复的组合,pandas 不知道如何变形,所以我们还是需要使用 pivot_table() 进行聚合透视,将 value 列中的值按 para 聚合为一个序列(比如元组),然后对它们进行爆炸,同时还要考虑对 para 形成的列的顺序进行一些调整。
根据思路,最终的代码如下:
(
df.pivot_table(index=['x1', 'x2', 'x3'],
columns='para',
values='value',
aggfunc=tuple
)
.reindex(columns=(cols:=df.para.unique()))
.explode([*cols])
.reset_index()
)
'''
x1 x2 x3 g d s
A 0.1 1 1 3 5
A 0.1 1 2 4 6
B 0.2 1 1 3 5
B 0.2 1 2 4 6
'''
这样就完成了需求。
(完)
更新时间:2024-08-30 09:06:19 标签:pandas python 透视