如何通过Pandas的pivot函数将DataFrame转换为指定格式?
当然可以实现!
直接用df.pivot(columns='store')没法一步到位得到你想要的格式,因为我们需要把color和size的所有唯一值合并成新的行索引,同时对重复组的quantity做求和,还要把缺失值补为0。下面是具体的实现方案:
1. 先回顾原始数据
我们先把你的原始代码和DataFrame列出来:
import pandas as pd data = dict(store=['A', 'B', 'B'], color=['red', 'black', 'black'], size=['small', 'medium', 'small'], quantity=[2, 4, 1]) df = pd.DataFrame(data)
对应的原始DataFrame:
| store | color | size | quantity | |
|---|---|---|---|---|
| 0 | A | red | small | 2 |
| 1 | B | black | medium | 4 |
| 2 | B | black | small | 1 |
2. 分步实现目标格式
我们需要分别处理color和size维度的聚合,再合并结果:
第一步:用pivot_table分别聚合color和size
pivot_table比pivot更适合这里,因为它支持聚合重复组的数值,还能直接填充缺失值:
# 按color聚合,store为列,求和quantity,缺失值填0 color_agg = df.pivot_table(index='color', columns='store', values='quantity', aggfunc='sum', fill_value=0) # 按size聚合,同样的逻辑 size_agg = df.pivot_table(index='size', columns='store', values='quantity', aggfunc='sum', fill_value=0)
第二步:合并两个聚合结果
用pd.concat把两个DataFrame的行合并起来,就得到你要的格式了:
final_df = pd.concat([color_agg, size_agg])
3. 最终结果
运行上面的代码后,final_df的输出就是:
A B red 2 0 black 0 5 small 2 1 medium 0 4
为什么不用直接的df.pivot(columns='store')?
因为pivot是基于唯一的行-列组合来重塑数据的,它不支持聚合操作——如果遇到重复的行-列组合(比如你的数据里B店出现了两次black),pivot会直接报错。而pivot_table正好解决了这个问题,还能一键处理缺失值填充,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者ajrlewis
相关产品推荐
相关产品推荐

