使用CSV数据python创建条形图

时间:2016-03-19 10:08:54

标签: python csv pandas matplotlib bar-chart

我有一个包含

等数据的CSV
4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2014-09-30 18:14:58,57,4
4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2014-09-30 20:11:15,1884,90
4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2014-10-04 09:44:21,1146,6
4be390eefaf9a64e7cb52937c4a5c77a,"avito.ru",2014-09-29 21:01:29,48,3

我将其排序为

print(infile.groupby(['address', infile['used_at'].dt.year]).active_seconds.sum())

我得到了数据:

address            used_at
am.ru              2014         413071
                   2015         183402
auto.ru            2014        9122342
                   2015        6923367
avito.ru           2014       84503151
                   2015       87688571
avtomarket.ru      2014         106849
                   2015          95927
cars.mail.ru/sale  2014         211456
                   2015         167278
drom.ru            2014       11014955
                   2015        9704124
e1.ru              2014       28678357
                   2015       27961857
irr.ru/cars        2014         222193
                   2015         133678

我需要像这样example

创建条形图

但我需要在2014年和2015年对每个网站(在x轴)和active_seconds(在y轴)的总和进行分类。 在示例中,他们使用np.array,但我有对象类型系列。

我尝试这样做:

width = 0.35
plt.figure()
ax = graph_by_duration['address'].plot(kind='bar', secondary_y=['active_seconds'])
ax.set_ylabel('Time online')
ax.set_title('Time spent online per web site, per year')
plt.show()

我应该将其转换为np.array或进程来执行此操作吗?

1 个答案:

答案 0 :(得分:2)

我认为您可以先添加reset_index,然后pivot DataFrame来创建列20142015。上次使用plot.bar

df = infile.groupby(['address', infile['used_at'].dt.year]).active_seconds.sum()
                                                                          .reset_index()
print df
              address  used_at  active_seconds
0               am.ru     2014          413071
1               am.ru     2015          183402
2             auto.ru     2014         9122342
3             auto.ru     2015         6923367
4            avito.ru     2014        84503151
5            avito.ru     2015        87688571
6       avtomarket.ru     2014          106849
7       avtomarket.ru     2015           95927
8   cars.mail.ru/sale     2014          211456
9   cars.mail.ru/sale     2015          167278
10            drom.ru     2014        11014955
11            drom.ru     2015         9704124
12              e1.ru     2014        28678357
13              e1.ru     2015        27961857
14        irr.ru/cars     2014          222193
15        irr.ru/cars     2015          133678
graph_by_duration = df.pivot(index='address', columns='used_at', values='active_seconds')
print graph_by_duration
used_at                2014      2015
address                              
am.ru                413071    183402
auto.ru             9122342   6923367
avito.ru           84503151  87688571
avtomarket.ru        106849     95927
cars.mail.ru/sale    211456    167278
drom.ru            11014955   9704124
e1.ru              28678357  27961857
irr.ru/cars          222193    133678

ax = graph_by_duration.plot.bar(figsize=(10,8))
ax.set_ylabel('Time online')
ax.set_title('Time spent online per web site, per year')
plt.show()

graph