AttributeError: у объекта 'Series' нет атрибута 'sqrt' - PullRequest
0 голосов
/ 13 февраля 2019

Я работаю с некоторыми наборами данных, которые я импортировал из 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])

Таким образом, a, b и c теперь определены как <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

1 Ответ

0 голосов
/ 13 февраля 2019

Ваши a и b являются массивами dtype объектов.Вы говорите

с формой (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)

Она делегирует математику методам объектов.+ и / работа, потому что соответствующие методы определены (для float в моем примере, Series в вашем).Но большинство классов не определяют метод sqrt, что приводит к ошибке.


Если все ваши начальные кадры данных имели одинаковое количество строк, массивы a, сделанные из них, были бы двумерными числовымиDTYPE.Вы могли бы сделать всю математику на них.Но поскольку кадры данных отличаются, массив, созданный из Series, является массивом dtype объектов Series.

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

2d числовой массив из 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')

Объектмассив с различными размерами Series:

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...