添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

AttributeError: 'Series' object has no attribute 'sqrt'.

0 人关注

我正在处理一些从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'的操作,就会出现一个错误,说明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])

But if I use the type function, d0... d12 are now <class 'pandas.core.series.Series'>, whereas a[0]b[0] are both <class 'numpy.ndarray'>.

  • What am I doing wrong?
  • Why am I not allowed to perform a simple square-root operation?
  • 我希望能添加数据,但我无法通过在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
        
    5 个评论
    你好,你是否介意制作一个 mcve
    你是否介意打印 a[0] b[0] 的输出?
    尽管我努力将其简化为MCVE,但由于我无法使用合成数据来重新创建它,所以我无法做到 -- 我为我的愚蠢行为感到抱歉。谢谢你试图理解我这个混乱的问题,用户32185。
    a b 是对象D型数组,包含系列,不是数字。对象数组上的数学运算是有的放矢的。为了做 sqrt ,它将任务委托给sqrt方法,或者说是尝试和失败
    你能不能提供一个整体结构的摘要,例如N个excel表,每个表有M列和R行,你是沿着什么 "维度 "进行计算的?
    python
    pandas
    numpy
    naughty_waves
    naughty_waves
    发布于 2019-02-13
    1 个回答
    hpaulj
    hpaulj
    发布于 2019-02-14
    已采纳
    0 人赞同

    你的 a b 是对象D型数组。 你说

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

    而错误表明,数组的元素是系列。

    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)
    

    它将数学运算委托给对象的方法。 +和/可以工作,因为相应的方法被定义了(在我的例子中是针对浮点,在你的例子中是针对系列)。 但大多数类没有定义sqrt的方法,因此失败了。

    如果你的初始数据框都有相同的行数,由它们组成的数组a将是2D的数字类型。 你可以对它们进行所有的numpy数学运算。 但是由于数据框架不同,由Series组成的数组是Series的对象dtype数组。

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

    相同大小的系列中的一个2维数字阵列。

    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)