如何在Pandas中创建无聚合透视表并对日期列进行排序
解决Pandas透视表日期聚合报错并实现Excel式透视效果
嘿,我明白你的问题了——你想用Pandas做个类似Excel里的透视表,按A、B列分组展示所有日期,结果却碰到了DataError: No numeric types to aggregate的报错对吧?
这个报错的原因很简单:Pandas的pivot_table()默认会对值列做聚合操作(比如求和、计数),但日期列不属于数值类型,没法执行这类聚合。而你想要的其实不是聚合,是按A、B分组后展示所有日期明细并排序,和Excel透视表展开明细的效果完全一致。
下面直接给你可行的解决方案,先从构造原始数据开始(方便你复现):
import pandas as pd # 构造你提供的原始DataFrame df = pd.DataFrame({ 'A': ['apple', 'apple', 'apple', 'apple', 'orange', 'orange', 'banana'], 'B': ['sweet', 'sweet', 'sweet', 'sweet', 'sour', 'sour', 'neither'], 'C': ['funny', 'dummy', 'dff', pd.NA, pd.NA, 'hhhg', pd.NA], 'D': ['2019-07-02', '2016-11-25', '2017-09-01', pd.NaT, '2020-01-01', '2020-12-12', '2015-01-01'] }) # 确保D列是日期类型(如果你的原始数据还没转换的话) df['D'] = pd.to_datetime(df['D'])
方法一:排序+层级索引(最接近Excel透视表效果)
这是最直观的方法,完全匹配你想要的输出:
# 1. 按A、B、D排序,把NaT放在最前面 sorted_df = df.sort_values(['A', 'B', 'D'], na_position='first') # 2. 去掉不需要的C列,然后设置A、B为层级索引 result = sorted_df.drop(columns='C').set_index(['A', 'B'])
运行后你会得到和期望完全一致的结果:
D A B apple sweet NaT sweet 2016-11-25 sweet 2017-09-01 sweet 2019-07-02 orange sour 2020-01-01 sour 2020-12-12 banana neither 2015-01-01
方法二:用pivot_table实现(备选)
如果你一定要用pivot_table,可以指定aggfunc为一个返回所有值的lambda函数,再展开结果:
# 创建透视表,保留所有日期值 pt = df.pivot_table(index=['A', 'B'], values='D', aggfunc=lambda x: x) # 展开列表形式的日期值,然后排序 result = pt.explode('D').sort_values('D', na_position='first').reset_index(level=[0,1], drop=False)
这个方法也能得到相同的结果,但不如第一种方法简洁直观。
总结一下:当你需要展示明细行而不是聚合结果时,用排序+层级索引的方式更合适,完全能实现Excel透视表的展开效果。
内容的提问来源于stack exchange,提问作者kavm
相关产品推荐
相关产品推荐

