熊猫中的嵌套分组

时间:2020-10-01 11:58:00

标签: python pandas pandas-groupby

问题

请考虑以下数据框:

import pandas as pd
from io import StringIO 
data = StringIO(""",ID,category,app,duplicated
    0,100,OperatingSystem,Finder,FALSE
    1,100,Browser,Chrome,FALSE
    2,100,Browser,Chrome,TRUE
    3,100,Browser,Chrome,FALSE
    4,100,Clipboard,Clipboard,FALSE
    5,200,Browser,Chrome,FALSE
    6,200,Browser,Chrome,TRUE
    7,200,Browser,Chrome,FALSE
    8,200,Clipboard,Clipboard,FALSE
    9,300,OperatingSystem,Finder,FALSE
    10,300,Browser,Chrome,TRUE
    11,300,OperatingSystem,Finder,FALSE
    12,300,Clipboard,Clipboard,FALSE
""" )
df_stack = pd.read_csv(data, index_col=0).fillna('')

使用this answer中的代码

s = df_stack.groupby('ID')['duplicated'].apply(lambda d : d.ne(d.shift()).cumsum())
d_groups = df_stack.groupby(s)
for g, dataframes in d_groups:
    print(f"\n[Group {g}] - {dataframes['duplicated'].unique()[0]} \n{'-'*20}")
    for index,row in dataframes.iterrows():
        print(index, row['duplicated'], row['category'], row['app'])

在以下条件下,我得到3个不同的组,如下图所示:

  • A组:对于每个ID,所有False行,直到该ID的第一个True行
  • B组:所有正确的行
  • C组:对于每个ID,该ID的最后一个True行之后的所有False行

我想要什么

我想按类别将A,B,C分组,以便总共获得6个分组(图像的右侧)。

enter image description here

编辑:我用double for循环解决了这个问题,遍历d_groups并将内部组分组。有没有更有效的解决方案?

1 个答案:

答案 0 :(得分:2)

我认为您只需要groupby上的df_stack数据框scategory即可获得所需的结果,因此不必仅按{{1 }}:

s

您应该在d_groups = df_stack.groupby(s) groupbys列:

category

结果:

d_groups = df_stack.groupby([s, 'category'])