为什么Pandas执行大表转置时无报错却丢失大量数据?
该问题并非内存不足导致,属于低版本Pandas的已知BUG,具体成因如下:
- 首先排除内存问题:2000万行的
Int64列总占用内存不到200MB,转置操作的内存开销远不足以触发内存不足,内存不足时Python会直接抛出MemoryError,不会出现静默丢数据的情况。 - 核心触发点是代码中使用的可空整数类型
Int64(大写I开头):Pandas 1.3.0之前的版本对ExtensionArray类型(包括可空整数、可空字符串等扩展类型)的转置逻辑存在边界错误,当单列行数超过2^21(约209万)时,转置后会静默截断超过阈值的部分,无任何错误提示,转置后剩余的197万列正好在该阈值附近,完全符合该BUG的表现。 - 验证方法:将代码中
seconds = seconds.astype(dtype='Int64')修改为普通整数类型seconds = seconds.astype('int64')(小写i开头)后再执行转置,数据不会丢失,两次求和结果会完全一致。
修复方案
- 优先升级Pandas到1.3.0及以上版本,该BUG在1.3.0版本的更新中已经被正式修复。
- 若暂时无法升级版本,可避开
DataFrame.T的转置逻辑,改用pd.DataFrame(seconds.values.reshape(1, -1))的方式构造行结构的DataFrame,不会出现截断问题。
内容的提问来源于stack exchange,提问作者madteachit
相关产品推荐
相关产品推荐

