【问题标题】:Python: Cant pyplot line chart using pandas pivot_tablePython:使用 pandas pivot_table 的 Cant pyplot 折线图
【发布时间】:2019-02-13 19:08:19
【问题描述】:

我有一个 CSV 作为日志文件/数据库。它的结构如下:

User1,Client3,Ops/Admin,19:33:46,19:33:57,178.054662,Notes,05/09/2018
User1,Client2,Ops/Admin,20:33:46,20:33:57,449.272576,Notes,05/09/2018
User1,Client3,Support Management,21:33:46,21:33:57,1073.425258,Notes,05/09/2018
User1,Client2,Support Management,22:33:46,22:33:57,290.640219,Notes,05/09/2018
User1,Client3,Ops/Admin,23:33:46,23:33:57,402.223927,Notes,05/09/2018
User1,Client1,Support Management,00:33:46,00:33:57,761.266062,Notes,05/09/2018
User1,Client1,Business Developement,01:33:46,01:33:57,1623.303656,Notes,05/09/2018

我想使用 matplotlib.pyplot 制作一个折线图,它汇总了每个客户在每个日期的 col[5] 总数。即同一图表上的不同线,其中 x 轴是日期 (col[7]),y 轴是该日期值的总和 (col[5])。

我正在使用 pandas,这是我的起点:

import matplotlib.pyplot as plt
import pandas as pd
import datetime, csv

csv_file = pd.read_csv("file.csv",
                           names = ['USER',
                                   'CLIENT',
                                   'TYPE',
                                   'START',
                                   'END',
                                   'DURATION',
                                   'NOTES',
                                   'DATE'])

然后我尝试将表格设为数据透视表:

date_pivot = csv_file.pivot_table('DURATION', index='CLIENT', columns='DATE')

或使用 .groupby() 函数:

dategroup = csv_file.groupby(['CLIENT','DATE'], as_index = False).sum()

两者似乎都生成了一个看起来应该足够使用的表格。

问题是,由于不乏尝试(...),我无法弄清楚如何在 matplotlib.pyplot.plot() 上按日期绘制 CLIENT 的总和值...您能帮忙吗?

到目前为止我唯一的想法:

  • 我是否应该以某种方式重新排列表格,以便客户端沿 Y 轴 (/index) 运行而日期沿 X 轴 (/header) 运行?
  • 是否需要某种形式的使用 .loc() 的 def 迭代函数?

对此的任何帮助将不胜感激,因此在此先感谢!

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    这会将客户和日期的求和结果再次基于客户分组,并为每个客户绘制一条单独的线:

    import matplotlib.pyplot as plt
    import pandas as pd
    
    df['DATE'] = pd.to_datetime(df['DATE'])
    aggregated = df.groupby(['CLIENT', 'DATE']).sum().reset_index()
    
    fig, ax = plt.subplots()
    
    for key, group in aggregated.groupby(['CLIENT']):
        ax = group.plot(ax=ax, kind='line', x='DATE', y='DURATION', label=key)
    
    plt.show()
    

    这是基于this 答案中的组图技巧。

    【讨论】:

    • 这非常有效,谢谢。虽然我添加了 label=key ,因为它显示错误。非常感谢!
    【解决方案2】:
    import numpy as np
    csv_file=pd.read_csv('file.csv',names =   ['USER',
                                   'CLIENT',
                                   'TYPE',
                                   'START',
                                   'END',
                                   'DURATION',
                                   'NOTES',
                                   'DATE'],parse_dates=['DATE'])
    csv_file.pivot_table('DURATION',index='DATE',columns='CLIENT',aggfunc=np.sum)
    
    • x 轴/索引/日期
    • 多个 y 轴/列/CLIENT
    • 聚合函数 = sum

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2019-06-30
      • 2022-09-24
      • 1970-01-01
      • 2017-08-26
      相关资源
      最近更新 更多