我正在创建一些新图,我想查看基于年份的数据。 我的数据如下:
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年有多少电子邮件和印刷品。 每年我都想查看详细信息。
答案 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()
输出:
答案 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的方法,并且可能更优雅,更有效。