环境:
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
第一个怎么了?
答案 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
在熊猫标准操作中定义。