DataFrame列apply方法返回异常结果原因排查求助
问题分析:Pandas apply 生成异常极小值的原因
嘿,我来帮你排查这个问题!你遇到的这个异常极小值(比如1.321089e-311)其实是内存里的垃圾值,根源出在你对apply方法的使用方式上——咱们一点点拆解:
为什么Method 1会出错?
pd.DataFrame.apply(axis=0)的设计初衷是对每一列做映射处理,返回一个新的Series/DataFrame,而不是用来执行“向列表追加元素”这种无返回的副作用操作。
你的原Method 1里,lambda函数只做了l1.append(...),没有显式返回任何值(默认返回None)。这时候apply会尝试把这些None收集起来生成一个新的DataFrame,而在这个过程中,Pandas内部的内存管理机制可能干扰了x.values的引用——你拿到的不再是原始列的真实数据,而是内存中已经被回收/未初始化的区域,所以才会出现那些诡异的极小值。
简单说:你用apply干了它不擅长的事,导致数据引用出问题了。
修正后的Method 1
如果想继续用apply,应该让它返回你需要的DataFrame,再把结果转成列表,这样就不会有内存引用的问题:
import numpy as np import pandas as pd rand = pd.DataFrame(np.random.normal(loc=0.0, scale=1.0, size=(20, 10))) l1 = rand.apply(lambda x: pd.DataFrame(x.values.reshape(4, 5)), axis=0).tolist()
这样l1的内容就会和l2完全一致了。
额外补充:关于效率
你原以为apply更高效,但其实在Pandas中,这种简单的列循环,显式for循环的性能不一定比apply差——apply本身有函数调用和内部处理的额外开销。如果追求极致效率,还可以用numpy的批量重塑来实现:
# 把整个数据转成(10,4,5)的三维数组,再逐个转成DataFrame arr = rand.values.reshape(4, 5, 10).transpose(2, 0, 1) l3 = [pd.DataFrame(mat) for mat in arr]
这种方式用numpy的向量操作减少了循环次数,通常会比逐列处理更快。
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

