在 Python 上绘制 CSV rows/columns 更简单
Plotting CSV rows/columns simpler on Python
我有一个要读取的 csv 文件。 excel/csv sheet 中的第一行是 headers "Jan|Feb|Mar..." 等列。然后每列下面 header 是浮点数据。我有以下代码:
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-axis 上,数据在 y-axis 上?
对我来说,最简单的方法是使用 pandas 库,因为它提供了直接来自数据框的绘图功能。
import pandas as pd
df = pd.read_csv('Data.csv', sep='|') # or your sep in file
...
df.plot.bar()
编辑:
如果您在 excel 中有数据,则无需像 csv 文件那样提供 sep。
读取 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()
Pandas 条形图文档:
https://pandas.pydata.org/pandas-docs/stable/visualization.html#visualization-barplot
虚假数据/设置:
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 objects return 行
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')]
>>>
您可以再次使用 zip 将列与其 header 相关联,并向图中添加图例
for month, data in zip(header, data_cols):
plt.plot(data, label = month)
plt.legend()
plt.show()
plt.close()
如果您只是想将数据放入容器中并让列与其 header 相关联,请将其放入字典中:
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')}
>>>
我有一个要读取的 csv 文件。 excel/csv sheet 中的第一行是 headers "Jan|Feb|Mar..." 等列。然后每列下面 header 是浮点数据。我有以下代码:
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-axis 上,数据在 y-axis 上?
对我来说,最简单的方法是使用 pandas 库,因为它提供了直接来自数据框的绘图功能。
import pandas as pd
df = pd.read_csv('Data.csv', sep='|') # or your sep in file
...
df.plot.bar()
编辑: 如果您在 excel 中有数据,则无需像 csv 文件那样提供 sep。 读取 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()
Pandas 条形图文档: https://pandas.pydata.org/pandas-docs/stable/visualization.html#visualization-barplot
虚假数据/设置:
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 objects return 行
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')]
>>>
您可以再次使用 zip 将列与其 header 相关联,并向图中添加图例
for month, data in zip(header, data_cols):
plt.plot(data, label = month)
plt.legend()
plt.show()
plt.close()
如果您只是想将数据放入容器中并让列与其 header 相关联,请将其放入字典中:
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')}
>>>