加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-17 17:36:01 所属栏目:Python 来源:网络整理
导读:环境: Python 3.6.4pandas 0.23.4 我的代码如下. from math import sqrtimport pandas as pddf = 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

环境:

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

第一个怎么了?

最佳答案
使用numpy.sqrt-它也适用于一维数组,而来自数学的sqrt仅适用于标量:

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

您的解决方案可以正常工作,因为轴= 1在应用中按标量进行工作,但是像提到的@jpp一样,应用不应被首选,因为它涉及Python级的逐行循环.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读