如何在Pandas中统计不区分顺序的唯一状态组合数量?
解决方案
要让draft,redraft和redraft,draft被视为同一状态组合,只需在生成每个id的状态组合前先对状态列表排序,这样不管原始顺序如何,排序后的组合都会一致。
修改后的代码如下:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'id': ['a', 'a', 'b', 'b', 'c', 'c', 'd', 'd'], 'status': ['approved', 'approved', 'draft', 'redraft', 'redraft', 'draft', 'approved', 'draft'] }) # 对每个id的status排序后生成有序组合 df1 = df.groupby('id')['status'].apply(lambda x: tuple(sorted(x))).rename('status_combo') df2 = df1.groupby(df1).size().reset_index(name='id_count') # 可选:将tuple转为逗号分隔的字符串,匹配期望输出格式 df2['status_combo'] = df2['status_combo'].apply(lambda x: ','.join(x)) print(df2)
运行结果:
status_combo id_count 0 approved,approved 1 1 approved,draft 1 2 draft,redraft 2
关键说明:
- 原代码直接将状态转为
tuple会保留原始顺序,加入sorted(x)后,每个id的状态列表会按字母顺序排序,确保不同顺序的相同状态组合被归为一类。 - 最后一步的
','.join(x)是为了将tuple格式的组合转为字符串,和你期望的输出格式完全一致,如果不需要字符串格式,可以跳过这一步。
内容的提问来源于stack exchange,提问作者kkkkkk
相关产品推荐
相关产品推荐

