看起来您正在传递列名的列表或数组。我假设这是因为您的变量名称是复数,末尾带有 s。如果是这种情况,那么sample[columns] 是一个数据框。这是一个问题,因为apply 遍历每一列,将您传递给apply 的lambda 传递给该列。所以你得到了
(-1) * np.power(-series_object, -1./3) if series_object < 0 else...
是series_object < 0 搞砸了,因为您要求整个系列的真实性小于零。
applymap
f = lambda x: -np.power(-x, 1./3) if x < 0 else np.power(x, 1./3)
sample[columns] = sample[columns].applymap(f)
也就是说,我会使用定义如下的lambda
f = lambda x: np.sign(x) * np.power(abs(x), 1./3)
然后您可以在整个数据帧上执行此操作
np.random.seed([3,1415])
df = pd.DataFrame(np.random.randint(-10, 10, (5, 5)))
df
0 1 2 3 4
0 6 1 -8 0 5
1 3 1 3 9 -2
2 -10 2 -10 -8 -10
3 -3 9 3 8 2
4 -6 -7 9 3 -3
f = lambda x: np.sign(x) * np.power(abs(x), 1./3)
f(df)
0 1 2 3 4
0 1.817121 1.000000 -2.000000 0.000000 1.709976
1 1.442250 1.000000 1.442250 2.080084 -1.259921
2 -2.154435 1.259921 -2.154435 -2.000000 -2.154435
3 -1.442250 2.080084 1.442250 2.000000 1.259921
4 -1.817121 -1.912931 2.080084 1.442250 -1.442250
同
df.applymap(f)
0 1 2 3 4
0 1.817121 1.000000 -2.000000 0.000000 1.709976
1 1.442250 1.000000 1.442250 2.080084 -1.259921
2 -2.154435 1.259921 -2.154435 -2.000000 -2.154435
3 -1.442250 2.080084 1.442250 2.000000 1.259921
4 -1.817121 -1.912931 2.080084 1.442250 -1.442250
检查是否相等
df.applymap(f).equals(f(df))
True
而且速度更快
%timeit df.applymap(f)
%timeit f(df)
1000 loops, best of 3: 1.11 ms per loop
1000 loops, best of 3: 473 µs per loop