绘制基于行的数据
Plotting row based data
我有一些数据看起来像这样:
df =
id period 15-nov 16-nov 17-nov 18-nov
------------------------------------------------------
vodka night 1 2 3 1
vodka day 0 1 2 0
vodka evening 1 2 2 0
rum night 1 2 3 3
rum day 1 2 2 0
rum evening 1 3 2 1
我想做的是绘制 header 日期的值,但按 ID 和时间段分组。所以基本上这将变成 6 条线图,x-axis 作为日期给出。
然而,也许我只是累了,但我觉得这个数据集很奇怪地放在一起,所以我通常的 groupby
东西不起作用,因为只有一些 header 是x-axis 个值。我正在考虑将日期列转换为一个列,然后将日期 headers 添加为另一列,总共有 4 列 - 但行数更多,然后使用 groupby
函数。但我想不出任何聪明的方法来做到这一点,接受也许是手动的。
这就是我要走的路,还是我错过了一个简单的转换技巧?
您可以使用 melt
反转数据框,然后使用 seaborn 绘制线条:
import seaborn as sns
df_melted = df.melt(value_vars=['15-nov', '16-nov', '17-nov', '18-nov'],
id_vars=['id', 'period'],
var_name='date'
)
sns.lineplot(data=df_melted.sort_values('date'),
x='date', y='value',
hue=df_melted['id'] + '_' + df_melted['period']
)
输出:
我有一些数据看起来像这样:
df =
id period 15-nov 16-nov 17-nov 18-nov
------------------------------------------------------
vodka night 1 2 3 1
vodka day 0 1 2 0
vodka evening 1 2 2 0
rum night 1 2 3 3
rum day 1 2 2 0
rum evening 1 3 2 1
我想做的是绘制 header 日期的值,但按 ID 和时间段分组。所以基本上这将变成 6 条线图,x-axis 作为日期给出。
然而,也许我只是累了,但我觉得这个数据集很奇怪地放在一起,所以我通常的 groupby
东西不起作用,因为只有一些 header 是x-axis 个值。我正在考虑将日期列转换为一个列,然后将日期 headers 添加为另一列,总共有 4 列 - 但行数更多,然后使用 groupby
函数。但我想不出任何聪明的方法来做到这一点,接受也许是手动的。
这就是我要走的路,还是我错过了一个简单的转换技巧?
您可以使用 melt
反转数据框,然后使用 seaborn 绘制线条:
import seaborn as sns
df_melted = df.melt(value_vars=['15-nov', '16-nov', '17-nov', '18-nov'],
id_vars=['id', 'period'],
var_name='date'
)
sns.lineplot(data=df_melted.sort_values('date'),
x='date', y='value',
hue=df_melted['id'] + '_' + df_melted['period']
)
输出: