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