我正在努力以自己想要的方式制作熊猫groupby multiindex图。我有以下虚拟熊猫数据框:
data = {
'Day': [1, 1, 2, 2, 3, 3, 4, 2, 4],
'Condition': ['A', 'B', 'A', 'A', 'A', 'B', 'B', 'B', 'A'],
'Invest': [1100, 2002, 500, 200, 1030, 4000, 750, 5000, 320],
'Spent': [100, 200, 100, 100, 100, 200, 50, 300, 250]
}
index = range(len(data['Day']))
columns = ['Day', 'Condition', 'Invest', 'Spent']
df = pd.DataFrame(data, index=index, columns=columns)
+----+-------+-------------+----------+---------+
| | Day | Condition | Invest | Spent |
|----+-------+-------------+----------+---------|
| 0 | 1 | A | 1100 | 100 |
| 1 | 1 | B | 2002 | 200 |
| 2 | 2 | A | 500 | 100 |
| 3 | 2 | A | 200 | 100 |
| 4 | 3 | A | 1030 | 100 |
| 5 | 3 | B | 4000 | 200 |
| 6 | 4 | B | 750 | 50 |
| 7 | 2 | B | 5000 | 300 |
| 8 | 4 | A | 320 | 250 |
+----+-------+-------------+----------+---------+
我可以使用以下命令获得后续剧情:
df.groupby(['Day', 'Condition']).sum()\
.unstack()\
.plot(subplots=True,
layout=(2,2),
figsize=(8,6));
问题:我希望将A和B结果分组在一起。例如,最上面的图(即(Invest,A)和((Invest,B))在一个图中在一起(对于Spent也是如此)。因此,我将只有2个子图,而不是4个子图。我在stackoverflow中有很多示例,但仍然无法使其正常工作。有些人建议融化并使用seaborn,但仍然没有效果,我更喜欢使用熊猫。
P.S。:“ 顶级”是什么意思?不确定我是否在这里使用正确的术语,但是当我拆开大熊猫的分组时,在MultiIndex中有不同的级别,我的意思是根据最高级别对图进行分组,如下所示:
df.groupby(['Day', 'Condition'])\
.sum()\
.unstack()
答案 0 :(得分:2)
我会这样:
df=df.groupby(['Day', 'Condition']).sum()\
.unstack()
df["Invest"].plot(figsize=(8,6), title="Invest")
df["Spent"].plot(figsize=(8,6), title="Spent")
plt.show()
答案 1 :(得分:0)
您可以轻松地将其分为两部分。
import matplotlib as plt
df1 = df.groupby(['Day', 'Condition']).sum().unstack()
print(df1)
Invest Spent
Condition A B A B
Day
1 1100 2002 100 200
2 700 5000 200 300
3 1030 4000 100 200
4 320 750 250 50
过滤df1以进行“投资”并绘图。 (我不知道如何将jupyter的图表输出复制到此处。很抱歉。)
df1.loc[:,('Invest', slice(None))].plot(subplots=True,
layout=(1,2),
figsize=(10,4));
现在过滤“已用”
df1.loc[:,('Spent', slice(None))].plot(subplots=True,
layout=(1,2),
figsize=(10,4));