使用matplotlib或Seaborn绘制组条形图,并使用Python中的Datetime索引
我有一个由日期列和感兴趣的类别列组成的熊猫数据框架。我想看看每个月的频率计数。当我用matplotlib做这件事时,我得到了一些看起来很糟糕的东西 以下是按月份分组时框架的外观:使用matplotlib或Seaborn绘制组条形图,并使用Python中的Datetime索引,python,pandas,dataframe,matplotlib,seaborn,Python,Pandas,Dataframe,Matplotlib,Seaborn,我有一个由日期列和感兴趣的类别列组成的熊猫数据框架。我想看看每个月的频率计数。当我用matplotlib做这件事时,我得到了一些看起来很糟糕的东西 以下是按月份分组时框架的外观: df.resample("M")["category_col"].value_counts(normalize=True).mul(100) Output date category_col 2019-12-31 A 41.
df.resample("M")["category_col"].value_counts(normalize=True).mul(100)
Output
date category_col
2019-12-31 A 41.929004
B 25.758765
C 17.752111
D 9.189919
E 3.625122
F 1.745080
2020-01-31 A 54.052744
C 16.347271
B 14.414431
D 11.677537
E 2.675607
F 0.832411
2020-02-29 A 48.928468
D 22.011116
C 14.084507
C 11.729162
E 2.193272
F 1.053475
2020-03-31 A 54.435410
D 15.718065
C 14.577060
B 11.335682
E 2.884205
F 1.049578
Name: category_col, dtype: float64
这是我的尝试
df.date = pd.to_datetime(df.date)
df.set_index("date", inplace=True)
df.resample("M")["category_col"].value_counts(normalize=True).mul(100).plot(kind="bar")
请参见下面的输出:
以下是我想要的:
我想您需要对datetimes的rormat月名年份进行重命名:
df.date = pd.to_datetime(df.date)
df = df.set_index("date")
s = df.resample("M")["category_col"].value_counts(normalize=True).mul(100)
s.unstack().rename(lambda x: x.strftime('%B %Y')).plot(kind="bar")
样本:
print (s)
date category_col
2019-12-31 A 41.929004
B 25.758765
C 17.752111
D 9.189919
E 3.625122
F 1.745080
2020-01-31 A 54.052744
C 16.347271
B 14.414431
D 11.677537
E 2.675607
F 0.832411
2020-02-29 A 48.928468
B 22.011116
C 14.084507
D 11.729162
E 2.193272
F 1.053475
2020-03-31 A 54.435410
D 15.718065
C 14.577060
B 11.335682
E 2.884205
F 1.049578
Name: A, dtype: float64
首先,要获取月份名称,请重置索引并选择正确的列:
df['month'] = df['date'].apply(lambda x: pd.Timestamp(x).strftime('%B'))
df = df.reset_index()
df = df[['month','category_col','value]]
然后,假设您有一个数据帧(称为df),如下所示:
month category_col value
September A 41.929004
September B 25.758765
使用Seaborn执行以下操作以获取要查找的绘图:
import seaborn as sns
ax = sns.barplot(x="month", y="value", hue="category_col", data=df)
这很有效。但条形图没有排序,日期显示为2020-01-31、2020-02,31。如何将它们更改为1月、2月等?在我从datetime导入datetime并应用上述内容后,我得到了以下错误:AttributeError:'str'对象没有属性'strftime'
@A.JT-它们没有丢失df.date=pd.to_datetime(df.date)df=df.set_index(“date”)
?是的,它是一个datetime@A.JT-什么是打印(s.unstack().index)
?
month category_col value
September A 41.929004
September B 25.758765
import seaborn as sns
ax = sns.barplot(x="month", y="value", hue="category_col", data=df)