Pandas分组构建序列:按固定值重置后汇总表异常求助
问题解决:按'000'重置患者序列分组并统计
你的核心问题是没给同一患者内被'000'分隔的子序列单独分组,导致所有pattern被合并成了一组。下面是调整后的代码,能实现按'000'重置分组,然后统计每个子序列的pattern组合及对应的患者数:
import pandas as pd df2 = pd.DataFrame({ 'patient': ['one', 'one', 'one', 'one','one', 'one','one','one','one','one','one','one'], 'pattern': ['A', 'B', '000', 'B', 'B', '000','D','A','C','000','A','B'], 'date': ['11/1/2022', '11/2/2022', '11/3/2022', '11/4/2022', '11/5/2022', '11/6/2022','11/7/2022', '11/8/2022', '11/9/2022','11/10/2022', '11/11/2022','11/12/2022'] }) # 1. 给每个患者内的子序列生成分组标识:遇到'000'就重置分组 df2['group_id'] = df2.groupby('patient')['pattern'].apply(lambda x: (x == '000').cumsum()) # 2. 过滤掉'000'的行,按患者+分组id分组,拼接pattern并统计患者数 grouped = (df2[df2['pattern'] != '000'] .sort_values(['patient', 'date']) .groupby(['patient', 'group_id']) .agg(pattern=('pattern', ','.join), patients=('patient', 'nunique'))) # 3. 按pattern汇总患者数总和 out = grouped.groupby('pattern')['patients'].sum().reset_index() print(out)
输出结果:
pattern patients 0 A,B 2 1 B,B 1 2 D,A,C 1
完全匹配你期望的desired DataFrame。
关键步骤说明:
group_id的生成:通过groupby('patient')后对pattern列统计'000'的累积次数,同一患者内每出现一次'000',后续行的group_id就加1,实现子序列的分组重置。- 后续先按
patient+group_id分组,这样每个被'000'分隔的子序列会被单独处理,拼接出对应的pattern字符串。 - 最后按pattern汇总,统计有多少个患者(或患者内的子序列)对应这个pattern组合。
内容的提问来源于stack exchange,提问作者Murali
相关产品推荐
相关产品推荐

