请考虑以下数据框:
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,B,C分组,以便总共获得6个分组(图像的右侧)。
编辑:我用double for循环解决了这个问题,遍历d_groups
并将内部组分组。有没有更有效的解决方案?
答案 0 :(得分:2)
我认为您只需要groupby
上的df_stack
数据框s
到category
即可获得所需的结果,因此不必仅按{{1 }}:
s
您应该在d_groups = df_stack.groupby(s)
上groupby
和s
列:
category
结果:
d_groups = df_stack.groupby([s, 'category'])