2017-09-15 47 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')} 
>>>