使用pandas

时间:2016-11-28 13:28:05

标签: python pandas

我是python的新手,在SO上看了很多类似的问题,但找不到任何与我有问题的东西,因此我提出了这个问题:

我有一个.xlsx数据集,数据分布在八个工作表中,我想执行以下操作:

  • 对每个工作表中第14列中的值求和(所有工作表中第14列的数据格式,布局和类型(分数)相同)
  • 使用每个工作表中第14列的所有求和值创建一个新工作表
  • 将总计得分从最高到最低排序
  • 在条形图中绘制总和值以进行比较

我甚至无法开始这个过程,因为我在第一点上挣扎。我正在使用pandas并且无法从一个特定的工作表中读取数据 - 我似乎只能从第一个工作表中读取数据(我打印结果以查看我的系统正在读取的内容)。

我的第一次尝试产生一个'空数据框':

import pandas as pd

y7data = pd.read_excel('Documents\\y7_20161128.xlsx', sheetname='7X', header=0,index_col=0,parse_cols="Achievement Points",convert_float=True)
print y7data

我也试过这个,但它只导出了整个第一个工作表的数据,而不是整个文档(我试图这样做,这样我就能理解如何导出所有数据)。我之所以选择这样做是因为如果我将数据导出到.csv,那么它可能会让我更清楚地看到出了什么问题,但我不是一个人:

import pandas as pd
import numpy as np

y7data = pd.read_excel('Documents\\y7_20161128.xlsx')

y7data.to_csv("results.csv")

我尝试了许多不同的东西来尝试并指定每个工作表中的哪一列,但无法使其工作;它似乎只产生第一个工作表的结果。

我如何首先从每个工作表中的第14列读取数据,然后执行其余步骤?

非常感谢任何指导。

更新(对于那些使用Enthought Canopy并与openpyxl挣扎的人):

我正在使用Enthought Canopy IDE,并且无论我尝试了什么,我都会不断收到openpyxl未安装的错误消息。对于那些遇到同样问题的人,请节省大量时间并阅读this post。简而言之,注册一个Enthought Canopy帐户(它是免费的),然后通过Canopy命令提示符运行此代码:

enpkg openpyxl 1.8.5

2 个答案:

答案 0 :(得分:1)

我认为您可以使用此示例file

首先将每个工作表中的所有列读取到名为list的列y7data

y7data = [pd.read_excel('y7_20161128.xlsx', sheetname=i, parse_cols=[13]) for i in range(3)]
print (y7data)
[   a
0  1
1  5
2  9,    a
0  4
1  2
2  8,    a
0  5
1  8
2  5]

然后concat将所有列放在一起,我添加了用于图表axis x的密钥,sum所有列,删除第二级MultiIndex({{1}在reset_index和最后sort_values

的示例数据中
a, a, a

创建新的print (pd.concat(y7data, axis=1, keys=['a','b','c'])) a b c a a a 0 1 4 5 1 5 2 8 2 9 8 5 summed = pd.concat(y7data, axis=1, keys=['a','b','c']) .sum() .reset_index(drop=True, level=1) .sort_values(ascending=False) print (summed) c 18 a 15 b 14 dtype: int64 DataFrame,设置列名并写入to_excel

df

如果需要添加新工作表,请使用此solution

df = summed.reset_index()#.
df.columns = ['a','summed']
print (df)
   a  summed
0  c      18
1  a      15
2  b      14

上次Series.plot.bar

from openpyxl import load_workbook

book = load_workbook('y7_20161128.xlsx')
writer = pd.ExcelWriter('y7_20161128.xlsx', engine='openpyxl') 
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
df.to_excel(writer, "Main", index=False)
writer.save()

graph

答案 1 :(得分:0)

根据我的理解,您当前的问题是从每个工作表中加载第14列。

您可以使用ExcelFile.parse代替read_excel并循环播放您的工作表。

xls_file = pd.ExcelFile('Documents\\y7_20161128.xlsx')
worksheets = ['Sheet1', 'Sheet2', 'Sheet3']
series = [xls_file.parse(sheet, parse_cols=[13]) for sheet in worksheets]
df = pd.DataFrame(series)

然后,sum()你的专栏继续前进。

使用ExcelFile然后使用ExcelFile.parse()有利于仅加载Excel文件一次,并迭代每个工作表。使用read_excel可以在每次迭代中加载Excel文件,这是无用的。

Documentation for pandas.ExcelFile.parse