为什么这种情况下熊猫数据帧分配引发TypeError

时间:2019-01-21 09:38:03

标签: python python-3.x pandas

环境:

Python 3.6.4
pandas 0.23.4

我的代码在下面。

from math import sqrt
import pandas as pd
df = pd.DataFrame({'x':[1,2,3], 'y':[4,5,6]})

df = df.assign(d = lambda z: sqrt(z.x**2 + z.y**2))

最下面一行引发TypeError,如下所示。

...
TypeError: cannot convert the series to <class 'float'>

没有sqrt,它可以工作。

df = df.assign(d2 = lambda z: z.x**2 + z.y**2)
df
Out[6]:
   x  y  d2
0  1  4  17
1  2  5  29
2  3  6  45

应用也可以。

df['d3'] = df.apply(lambda z: sqrt(z.x**2 + z.y**2), axis=1)
df
Out[8]:
   x  y  d2        d3
0  1  4  17  4.123106
1  2  5  29  5.385165
2  3  6  45  6.708204

第一个怎么了?

2 个答案:

答案 0 :(得分:2)

使用numpy.sqrt-它也适用于一维数组,而sqrt中的math仅适用于标量:

df = df.assign(d = lambda z: np.sqrt(z.x**2 + z.y**2))

另一种解决方案是使用**(1/2)

df = df.assign(d = lambda z: (z.x**2 + z.y**2)**(1/2))

print (df)
   x  y         d
0  1  4  4.123106
1  2  5  5.385165
2  3  6  6.708204

您的解决方案有效,因为axis=1中的apply是标量工作的,但就像提到的@jpp一样,apply不应首选,因为它涉及Python级的逐行循环。

df.apply(lambda z: print(z.x), axis=1)
1
2
3

答案 1 :(得分:0)

pandas系列对象就像一个numpy数组,无法操作数学模块 那是在寻找一个单一的对象,而不是一个序列。 默认的数学运算有效,但不适用于数组/序列的函数。

您可以做的是:

df = df.assign(d = lambda z: (z.x**0.5 + z.y**0.5))

df['d'] = df.z.x**0.5 + df.y.x**0.5

在熊猫标准操作中定义。