首页 文章

在Python上绘制CSV行/列更简单

提问于
浏览
0

我有一个我想读的csv文件 . excel / csv工作表中的第一行是列 Headers “Jan | Feb | Mar ...”等 . 然后在每个列 Headers 下面是浮点数据 . 我有以下代码:

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 回答

  • 1

    对我来说,最简单的方法是使用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()
    

    大白菜的熊猫文件:https://pandas.pydata.org/pandas-docs/stable/visualization.html#visualization-barplot

  • 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')]
    >>>
    

    您可以使用zip将列与其 Headers 相关联,并在图中添加图例

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

    enter image description here


    如果您只想将数据放入容器并将列与其 Headers 相关联,请将其放在dict中:

    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')}
    >>>
    

相关问题