pandas创建Pivot Table报datetime与int不支持<比较错误
问题现象
基于超大规模数据集创建用于统计计数、求和的Pivot Table时,每次执行创建操作均返回如下报错:
TypeError: '<' not supported between instances of 'datetime.datetime' and 'int'
透视表逻辑使用的所有列从dtype检查结果看均不是datetime类型,已尝试两种代码实现均触发报错。
第一种实现代码:
unused_columns=df4.columns.difference(set(['MATERIAL_C']).union(set(['Cat'])).union(set({'ORDER_QUANTITY'}))) tmp_df = df4.drop(unused_columns, axis=1) pivot_table = tmp_df.pivot_table( index=['MATERIAL_C'], columns=['Cat'], values=['ORDER_QUANTITY'], aggfunc={'ORDER_QUANTITY': ['count']}, ) pivot_table.set_axis([flatten_column_header(col) for col in pivot_table.keys()], axis=1, inplace=True) df3_pivot = pivot_table.reset_index()
第二种简化实现:
countPivot = pd.pivot_table(data = df3,index = ["MATERIAL_C"],columns = ["Cat"],values = "ORDER_QUANTITY",aggfunc = "count")
已检查数据框各列dtype,结果如下:
SO-Item int64 MATERIAL_C object ORDER_QUANTITY float64 REQUESTED_DELIVERY_DATE int64 DELIVERY_DATE int64 Months int32 Cat object
因数据集体量极大,普通pandas逻辑手动构造数据框耗时极长,需要低开销的修复方案。
故障原因
- pandas
pivot_table默认会对index、columns传入的字段做排序操作,排序过程中会逐值比较大小。列dtype显示为object不代表列内值类型完全统一,object是pandas的混合类型通用标识,只要列内混入了少量datetime对象和int/str值,排序比较时就会触发该类型错误。 - 即使手动drop了非透视用到的列,只要
Cat或MATERIAL_C列内部存在混合类型值,就会触发报错,和其他未参与透视的日期列无直接关联。
修复步骤
- 先统一参与透视的三列数据类型,该操作是向量化执行,超大数据集下也几乎无额外开销:
# 分类列统一转字符串,彻底杜绝混合类型问题 df4['MATERIAL_C'] = df4['MATERIAL_C'].astype(str) df4['Cat'] = df4['Cat'].astype(str) # 数值列强制转数值类型,异常值置空后补0,避免隐式类型转换 df4['ORDER_QUANTITY'] = pd.to_numeric(df4['ORDER_QUANTITY'], errors='coerce').fillna(0) - 透视表传入
sort=False参数,关闭内部默认的排序逻辑,既可以绕开类型比较的报错点,还能大幅降低超大数据集下透视表的计算耗时:
修改后的可直接运行的代码:countPivot = pd.pivot_table( data = df4, index = ["MATERIAL_C"], columns = ["Cat"], values = "ORDER_QUANTITY", aggfunc = "count", sort=False ) - 如果执行完前两步仍报错,运行下面一行代码即可快速定位
Cat列内的值类型分布,无需遍历全量数据做抽样排查:
若输出结果中存在print(df4['Cat'].apply(type).value_counts())datetime.datetime类型的计数,将对应异常值统一转换为字符串或过滤即可。
内容的提问来源于stack exchange,提问作者Andrew Robinson
相关产品推荐
相关产品推荐

