使用Pandas创建数据透视表失败,报索引重排相关错误求助
问题分析与解决方案
首先,先纠正一个拼写小错误:你写的privot_table应该是pivot_table,但更关键的问题是没有指定values参数,这才是触发报错的核心原因。
修正后的代码
import numpy as np import pandas as pd # 针对你的DataFrame执行透视表操作 df.pivot_table( index=['year', 'month'], columns=['source'], values='source', # 指定要聚合的列,选任意存在的列即可,这里用source最直观 aggfunc=np.size, fill_value=0 )
或者更简洁地使用pandas内置的聚合标识:
df.pivot_table( index=['year', 'month'], columns=['source'], values='source', aggfunc='size', fill_value=0 )
为什么会报错?
你遇到的Reindexing only valid with uniquely values index objects错误,本质是因为未指定values时,pivot_table会对DataFrame中所有非分组列执行聚合。如果你的DataFrame除了year、month、source还有其他列,这会生成一个带有多层列结构的透视表。当pandas尝试用fill_value=0填充缺失值时,内部的重索引操作会因为这个多层列的非唯一性而失败。
指定values参数后,pandas只会针对你指定的列进行计数,生成单层列结构的透视表,就不会触发这个索引错误了。
另一种更直观的实现方式
你也可以用groupby+unstack的组合来实现相同需求,逻辑更清晰,也不容易踩坑:
df.groupby(['year', 'month', 'source']).size().unstack(fill_value=0)
验证结果
针对你的示例数据,上述代码都会生成符合预期的结果:
| year | month | A | B |
|---|---|---|---|
| 2001 | 02 | 2 | 0 |
| 2001 | 03 | 0 | 3 |
内容的提问来源于stack exchange,提问作者HHH
相关产品推荐
相关产品推荐

