【发布时间】:2017-08-03 07:28:49
【问题描述】:
一年的样本数据:
import pandas as pd
import numpy.random as rnd
import seaborn as sns
n = 365
df = pd.DataFrame(data = {"A":rnd.randn(n), "B":rnd.randn(n)+1},
index=pd.date_range(start="2017-01-01", periods=n, freq="D"))
我想将这些数据并排按月分组(即每月两个框,一个用于A,一个用于B)。
对于单个列 sns.boxplot(df.index.month, df["A"]) 工作正常。但是,sns.boxplot(df.index.month, df[["A", "B"]]) 会引发错误 (ValueError: cannot copy sequence with size 2 to array axis with dimension 365)。通过索引 (pd.melt(df, id_vars=df.index, value_vars=["A", "B"], var_name="column")) 融合数据以使用 seaborn 的 hue 属性作为解决方法也不起作用 (TypeError: unhashable type: 'DatetimeIndex')。
(如果使用普通 matplotlib 更容易,解决方案不一定需要使用 seaborn。)
编辑
我找到了一种解决方法,基本上可以产生我想要的东西。但是,一旦 DataFrame 包含的变量多于我想要绘制的变量,使用起来就会有些尴尬。所以如果有更优雅/直接的方法,请分享!
df_stacked = df.stack().reset_index()
df_stacked.columns = ["date", "vars", "vals"]
df_stacked.index = df_stacked["date"]
sns.boxplot(x=df_stacked.index.month, y="vals", hue="vars", data=df_stacked)
【问题讨论】:
-
您能详细说明一下“但是,一旦 DataFrame 包含的变量比我想要绘制的多,使用起来就会有些尴尬?”
标签: python pandas plot seaborn boxplot