2017-09-15 40 views
0

我有一个csv文件,我正在阅读。 excel/csv工作表中的第一行是列标题“Jan | Feb | Mar ...”等。然后在每个列标题下面是浮点数据。我有以下代码:在Python上绘制CSV行/列更简单

filename ='Data.csv' 
with open(filename) as f: 
csvreader = csv.reader(f) 
header_row = next(csvreader) 
Jan, Feb = [], [] .... #(and so on) 
Mar = [] 
Apr = [] 
May = [] 
Jun = [] 
Jul = [] 
Aug = [] 
Sep = []  
Oct = [] 
Nov = [] 
Dec = [] 
for row in csvreader: 
    Jan.append(float(row[1])) 
    Feb.append(float(row[2])) 
    Mar.append(float(row[3])) 
    Apr.append(float(row[4])) 
    May.append(float(row[5])) 
    Jun.append(float(row[6])) 
    Jul.append(float(row[7])) 
    Aug.append(float(row[8])) 
    Sep.append(float(row[9])) 
    Oct.append(float(row[10])) 
    Nov.append(float(row[11])) 
    Dec.append(float(row[12])) 

我怎样才能凝聚这个代码,所以我可以很容易地绘制条形图与x轴的几个月和数据在y轴?

+2

一件事,你可以问CSV读者解析标题。 DictReader https://docs.python.org/3/library/csv.html#csv.DictReader可以帮助其他人。 – pvg

回答

1

对我来说,最简单的方法就是使用熊猫库,因为它提供了直接来自数据框的绘图功能。

import pandas as pd 

df = pd.read_csv('Data.csv', sep='|') # or your sep in file 
... 
df.plot.bar() 

编辑: 如果你在Excel中的数据,也没有必要提供九月,因为它是为csv文件。 来读取Excel文件,它是那样简单:

df = pd.read_excel('Data.xlsx', sheetname='name') 
df.plot.bar() 

http://pandas.pydata.org/pandas-docs/version/0.20/generated/pandas.read_excel.html

一些例子:

df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd']) 
df2.plot.bar() 

熊猫barplot的文档: https://pandas.pydata.org/pandas-docs/stable/visualization.html#visualization-barplot

+0

'最好的方式......似乎是主观的,为什么比使用'csv'模块更好? – wwii

+0

对不起,我编辑了主观部分...,这是因为你使用一个packege从数据帧接口读取文件,清理文件和打印文件 – StefanK

+0

我还在学Python,但到目前为止我还不是熊猫的粉丝。什么是“sep”命令。我在Excel中的文件和我正在使用|只是为了显示月份是在不同的列。 – Jonathon

1

假数据/设置:

import csv, io 
from pprint import pprint 
from matplotlib import pyplot as plt 

s = '''a, b, c 
1, 2, 3 
4, 5, 6 
7, 8, 9''' 
csv_file = io.StringIO(s) 
reader = csv.reader(csv_file) 

csv.reader对象返回行

header = next(reader) 
data_rows = list(reader) 

>>> pprint(data_rows, width = 20) 
[['1', ' 2', ' 3'], 
['4', ' 5', ' 6'], 
['7', ' 8', ' 9']] 
>>> 

您可以使用zip()将数据转置成列

data_cols = zip(*data_rows) 

>>> pprint(list(data_cols), width = 20) 
[('1', '4', '7'), 
(' 2', ' 5', ' 8'), 
(' 3', ' 6', ' 9')] 
>>> 

你可以用自己的头,再次使用压缩的列相关联,并添加传说到地块

for month, data in zip(header, data_cols): 
    plt.plot(data, label = month) 
plt.legend() 
plt.show() 
plt.close() 

enter image description here


如果你只是想获得的数据放入容器中,并与他们的头相关联的列,把它放在一个字典:

data = {} 
for month, column in zip(header, data_cols): 
    data[month] = column 

>>> data 
{'a': ('1', '4', '7'), ' b': (' 2', ' 5', ' 8'), ' c': (' 3', ' 6', ' 9')} 
>>>