Pandas Groupby Plotting MultiIndex 按***分组

Posted

技术标签:

【中文标题】Pandas Groupby Plotting MultiIndex 按***分组【英文标题】:Pandas Groupby Plotting MultiIndex Grouped by Top Level 【发布时间】:2019-09-28 23:52:59 【问题描述】:

我正在努力按照我想要的方式制作 pandas groupby 多索引图。我有以下虚拟熊猫数据框:

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 个子图。我在***中有很多示例,但仍然无法使其工作。有人建议融化并使用 seaborn,但仍然没有用,我更喜欢使用 pandas。

P.S.:“***”是什么意思?我是否在这里使用了正确的术语,不确定,但是当我将分组的熊猫解开时,在 MultiIndex 中有各种级别,我的意思是根据顶层来分组,如下所示:

df.groupby(['Day', 'Condition'])\
   .sum()\
   .unstack()

【问题讨论】:

【参考方案1】:

我会这样做:

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()

【讨论】:

谢谢。它就像魅力一样。我希望在不明确给出列名的情况下找到另一种方法。到目前为止,你的只是工作。接受...【参考方案2】:

你可以很容易地把它一分为二。

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));

【讨论】:

以上是关于Pandas Groupby Plotting MultiIndex 按***分组的主要内容,如果未能解决你的问题,请参考以下文章

pandas.groupby中的迭代

Groupby并在pandas中执行多个函数的聚合

Python pandas:替换 groupby 对象中的选择值

解决在jupyter notebook中遇到的ImportError: matplotlib is required for plotting问题

Python、Pandas:GroupBy 属性文档

pandas如何对value列数据进行分组groupby?