【问题标题】:AttributeError: 'Series' object has no attribute 'sqrt'AttributeError:“系列”对象没有属性“sqrt”
【发布时间】:2019-07-07 10:15:05
【问题描述】:

我正在处理一些从 EXCEL 导入并转换为列表的数据集:

import pandas as pd
import numpy as np

datfrms = []
for i in xls.sheet_names:                                       
    df = pd.read_excel(xls, i)
    datfrms.append(df) 

data_a = []
data_b = []
data_c = []

for dfs in datfrms:
    data_a.append(dfs.loc[:,'data_a'])
    data_b.append(dfs.loc[:,'data_b'])
    data_c.append(dfs.loc[:,'data_c'])

然后,我想对数据进行一些计算,所以我决定将列表转换为 numpy 数组,同时执行一些计算:

a = np.asarray([2 * (a + b) for a, b in zip(data_a, data_b])
b = np.asarray([c / 1000 for c in data_c])

因此,abc 现在定义为<class 'numpy.ndarray'>,形状为(13,),对应于我上面导入的 13 张工作表。每当我想访问第一张表中的数据时,我都会写,例如,data_a[0]

但是,如果我想执行以下操作,则会出现一个错误,指出 AttributeError: 'Series' object has no attribute 'sqrt'

d = np.sqrt(a / b)

如果我手动写入不会产生错误:

d0 = np.sqrt(a[0] / b[0])
...
d12 = np.sqrt(a[12] / b[12])

但如果我使用type 函数,d0...d12 现在是<class 'pandas.core.series.Series'>,而a[0]b[0] 都是<class 'numpy.ndarray'>

  • 我做错了什么?
  • 为什么不允许我执行简单的平方根运算?

我希望我可以添加数据,但我无法通过在 Python 中制作合成数据来重新创建数据格式,我怀疑这可能是问题的核心(即我在数据格式方面做错了) .

user32185分别请求a[0]b[0]的输出:

0     0.883871
1     0.885714
2     0.879378
3     0.865668
4     0.866014
5     0.860657
6     0.866071
7     0.884389
8     0.892339
9     0.892512
10    0.841590
11    0.841014
12    0.882200
13    0.857546
14    0.850576
15    0.853975
16    0.838710
dtype: float64

0     3.701151
1     3.701938
2     3.700758
3     3.690926
4     3.685027
5     3.688959
6     3.712556
7     3.786099
8     3.888745
9     3.956389
10    3.799078
11    3.799078
12    3.778627
13    3.669295
14    3.638620
15    3.606371
16    3.547379
Name: b, dtype: float64

【问题讨论】:

  • 嗨,你介意生成一个mcve
  • 你介意打印a[0]b[0]的输出吗?
  • 尽管我努力将其简化为 MCVE,但我无法使用合成数据重新创建它——我为自己的愚蠢道歉。感谢您尝试理解我的问题,user32185。
  • ab 是对象 dtype 数组,包含系列,而不是数字。对象数组上的数学被击中或错误。要执行sqrt,它将任务委托给 sqrt 方法,或者更确切地说尝试并失败
  • 您能否提供一个总体结构的摘要,例如N 个 excel 工作表,每个工作表有 M 列和 R 行,并且您正在执行计算的“维度”是什么?

标签: python pandas numpy


【解决方案1】:

您的 ab 是对象 dtype 数组。你说

形状为(13,),对应我上面导入的13张表

并且错误表明数组的元素是Series。

type(a[0])   # what is it?

对象 dtype 数组上的数学是命中或失误:

In [195]: x = np.array([1.2, 2.3], object)
In [196]: np.sqrt(x)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-196-0b43c7e80401> in <module>()
----> 1 np.sqrt(x)

AttributeError: 'float' object has no attribute 'sqrt'
In [197]: (x+x)/2
Out[197]: array([1.2, 2.3], dtype=object)

它将数学委托给对象的方法。 + 和 / 有效,因为定义了相应的方法(在我的示例中为浮点数,在您的示例中为 Series)。但是大多数类都没有定义sqrt 方法,因此失败了。


如果您的初始数据帧都具有相同的行数,则由它们组成的数组 a 将是 2d numeric dtype。你可以对它们做所有的数学运算。但是因为dataframes不同,由Series组成的数组是Series的object dtype数组。

In [201]: df1 = pd.DataFrame(np.arange(12).reshape(4,3))

来自 Series 的相同大小的二维数值数组:

In [204]: x=np.array([df1.loc[:,0], df1.loc[:,1]])
In [205]: x
Out[205]: 
array([[ 0,  3,  6,  9],
       [ 1,  4,  7, 10]])
In [206]: x.dtype
Out[206]: dtype('int64')

一个不同大小的对象数组系列:

In [207]: df2 = pd.DataFrame(np.arange(15).reshape(5,3))
In [208]: x=np.array([df1.loc[:,0], df2.loc[:,0]])
In [210]: type(x[0])
Out[210]: pandas.core.series.Series

对象数组的求和有效,但请注意 dtype

In [212]: x+x
Out[212]: 
array([0     0
1     6
2    12
3    18
Name: 0, dtype: int64,
       0     0
1     6
2    12
3    18
4    24
Name: 0, dtype: int64], dtype=object)

In [213]: np.sqrt(x)
...
AttributeError: 'Series' object has no attribute 'sqrt'

【讨论】:

  • 谢谢你,hpaulj。这正是发生的事情。有时我会进行额外的测量以检查实验的可重复性,因此行数可能会有所不同。一旦我从工作表中删除了这些额外的行,它就可以工作了。当谈到 python 时,我觉得自己像个白痴,但我真的很想学习它以便在我的学习中实施它。感谢像你这样的人,我能够取得进展。 :)
猜你喜欢
  • 2020-03-01
  • 1970-01-01
  • 2020-11-11
  • 2019-04-22
  • 2019-07-26
  • 2020-04-04
  • 2019-09-16
  • 2017-12-12
  • 2018-05-25
相关资源
最近更新 更多