我有一个 df,它由两列“日期”和“值”组成,包含“值”的多年数据。我想创建一个按月和年分组的值范围的箱线图。我使用 groupby 对值进行分组:
df.groupby(df['date'].dt.strftime('%b%Y'))['value']
但现在我无法弄清楚如何对生成的 groupby 数据结构进行操作以创建箱线图(通过 matplotlib 或 seaborn)。难倒。
答案 0 :(得分:0)
假设您的数据帧看起来像是由以下代码生成的:
import pandas as pd
import numpy as np
df = pd.DataFrame({'date': pd.date_range('2019-1-1', periods=1000, freq='D'),
'value': np.random.randint(0,10,size=1000)})
看起来像这样:
date value
0 2019-01-01 3
1 2019-01-02 9
2 2019-01-03 2
3 2019-01-04 2
4 2019-01-05 4
.. ... ...
995 2021-09-22 3
996 2021-09-23 5
997 2021-09-24 1
998 2021-09-25 4
999 2021-09-26 8
现在您可以计算新列 month
:
df['month'] = df.date.dt.month
date value month
0 2019-01-01 3 1
1 2019-01-02 9 1
2 2019-01-03 2 1
3 2019-01-04 2 1
4 2019-01-05 4 1
.. ... ... ...
995 2021-09-22 3 9
996 2021-09-23 5 9
997 2021-09-24 1 9
998 2021-09-25 4 9
999 2021-09-26 8 9
并使用此新列作为石斑鱼调用 boxplot
:
df.boxplot('value', by='month')
答案 1 :(得分:0)
parse_dates 您的时间序列日期列并将其设置为索引。使用 pd.Grouper 和级别 0 访问索引并将频率设置为 D 或每天。箱线图将根据 grouped.index.year
找到最小和最大频率以及中值和异常值df=pd.read_csv('sp500.csv',parse_dates=['Date'],index_col='Date')
grouped=df.groupby(pd.Grouper(level=0,freq='D'))['Open'].mean()
sns.boxplot(x=grouped.index.year, y=grouped.values,
data=grouped)
plt.xticks(rotation=90)
plt.show()
答案 2 :(得分:0)
您可以按月使用日期时间访问器 to_period()
进行分组。
import pandas as pd
import numpy as np
df = pd.DataFrame({'date': pd.date_range('2019-1-1', periods=1000, freq='D'),
'value': np.random.randint(0,10,size=1000)})
df.groupby(df.date.dt.to_period("M")).boxplot(subplots=False, rot=90)