Pandas DataFrame 的三次根

mam*_*oku 4 python numpy dataframe python-3.x pandas

我了解如何计算正数和负数的立方根。但是,当尝试使用apply-lambda方法有效处理数据帧的所有元素时,我遇到了歧义问题。有趣的是,这个错误不会因相等而出现,所以我想知道代码可能有什么问题:

sample[columns]=sample[columns].apply(lambda x: (-1)*np.power(-x,1./3) if x<0 else np.power(x,1./3))
Run Code Online (Sandbox Code Playgroud)

piR*_*red 5

看起来您正在传递列名称的列表或数组。我认为这是因为你的变量名是复数,s末尾有一个。如果是这种情况,那么sample[columns]就是一个数据帧。这是一个问题,因为apply迭代每一列,传递lambda您传递给的该列apply该列。所以你得到

\n\n
(-1) * np.power(-series_object, -1./3) if series_object < 0 else...\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是series_object < 0把事情搞砸的原因,因为你要求整个系列的真实性小于零。

\n\n
\n\n

applymap

\n\n
f = lambda x: -np.power(-x, 1./3) if x < 0 else np.power(x, 1./3)\nsample[columns] = sample[columns].applymap(f)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

也就是说,我会使用lambda如下定义

\n\n
f = lambda x: np.sign(x) * np.power(abs(x), 1./3)\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后你可以在整个数据帧上执行此操作

\n\n
np.random.seed([3,1415])\ndf = pd.DataFrame(np.random.randint(-10, 10, (5, 5)))\n\ndf\n\n    0  1   2  3   4\n0   6  1  -8  0   5\n1   3  1   3  9  -2\n2 -10  2 -10 -8 -10\n3  -3  9   3  8   2\n4  -6 -7   9  3  -3\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n
f = lambda x: np.sign(x) * np.power(abs(x), 1./3)\nf(df)\n\n          0         1         2         3         4\n0  1.817121  1.000000 -2.000000  0.000000  1.709976\n1  1.442250  1.000000  1.442250  2.080084 -1.259921\n2 -2.154435  1.259921 -2.154435 -2.000000 -2.154435\n3 -1.442250  2.080084  1.442250  2.000000  1.259921\n4 -1.817121 -1.912931  2.080084  1.442250 -1.442250\n
Run Code Online (Sandbox Code Playgroud)\n\n

与...一样

\n\n
df.applymap(f)\n\n          0         1         2         3         4\n0  1.817121  1.000000 -2.000000  0.000000  1.709976\n1  1.442250  1.000000  1.442250  2.080084 -1.259921\n2 -2.154435  1.259921 -2.154435 -2.000000 -2.154435\n3 -1.442250  2.080084  1.442250  2.000000  1.259921\n4 -1.817121 -1.912931  2.080084  1.442250 -1.442250\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

检查是否相等

\n\n
df.applymap(f).equals(f(df))\n\nTrue\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

而且速度更快

\n\n
%timeit df.applymap(f)\n%timeit f(df)\n\n1000 loops, best of 3: 1.11 ms per loop\n1000 loops, best of 3: 473 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n