熊猫数据框:按年份绘制条形图

时间:2018-08-17 15:57:26

标签: python pandas matplotlib

我正在创建一些新图,我想查看基于年份的数据。 我的数据如下:

  creation_time   physical_device_type
---------------   --------------------
7/25/2018 14:53   email
7/26/2018 14:53   printer
7/26/2017 14:53   email 
7/24/2017 14:53   printer
7/23/2017 14:53   email
7/22/2019 14:53   email
7/22/2019 14:53   email
7/22/2019 14:53   email

我想在x轴上看到各种图表作为年份。

temp_col = ['creation_time', 'physical_device_type']
df = pd.DataFrame(self.data_frame, columns=temp_col)
grouped = df.groupby(['creation_time','physical_device_type'])
df['creation_time'] = pd.to_datetime(df['creation_time'])
df.index = df['creation_time']
grouped_df = df.groupby([(df.index.year),'physical_device_type'])

grouped_df = pd.DataFrame(grouped_df.size().reset_index(name='count'))
grouped_df.plot('creation_time', kind='bar')

上面的代码为我提供了2018年的两个条形图。

我想看看2018年有多少电子邮件和印刷品。 每年我都想查看详细信息。

2 个答案:

答案 0 :(得分:1)

使用pivot_table

(df.pivot_table(
    index=df.creation_time.dt.year,
    columns='physical_device_type',
    aggfunc='size').plot(kind='bar', stacked=True, colormap='dark2', width=0.2)
)

plt.tight_layout()
plt.show()

输出:

enter image description here

答案 1 :(得分:0)

我想您可以使用循环来过滤当年的数据框。确保您的列temp = u"""creation_time physical_device_type 7/25/2018 14:53 email 7/26/2018 14:53 printer 7/26/2017 14:53 email 7/24/2017 14:53 printer 7/23/2017 14:53 email 7/22/2019 14:53 email 7/22/2019 14:53 email 7/22/2019 14:53 email""" df = pd.read_csv(io.StringIO(temp),delim_whitespace = True).reset_index() df['creation_time'] = df['index'] + ' ' + df['creation_time'] df.drop('index',1,inplace = True) df.creation_time = pd.to_datetime(df.creation_time) 的格式为pandas datetime。

创建数据框:

df['year'] = df.creation_time.dt.year
for year in df.year.unique():
    df.loc[df.year == year].groupby('physical_device_type').agg(len).plot(kind = 'bar')
    plt.title(year)

提取年份并绘制图:

    $("#sec1").text(Sector1);

但这不是一个非常Python的方法,并且可能更优雅,更有效。