我正在处理从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
答案 0 :(得分:1)
您的a
和b
是对象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)
它将数学委托给对象的方法。 +和/有效,因为定义了相应的方法(在我的示例中为float,在您的示例中为Series)。但是大多数类没有定义sqrt
方法,因此会失败。
如果初始数据帧的行数均相同,则由它们构成的数组a
将是2d数字dtype。您可以对它们进行所有的numpy数学运算。但是因为数据帧不同,所以Series组成的数组是Series的对象dtype数组。
In [201]: df1 = pd.DataFrame(np.arange(12).reshape(4,3))
来自Series的具有相同大小的2d数字数组:
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'