如何基于Pandas分组序列处理结果生成指定汇总数据集?
问题
现有经过以下Pandas代码处理后的DataFrame df2:
import pandas as pd df2 = pd.DataFrame({'patient': ['one', 'one', 'one', 'three','three', 'two','two','two','two'], 'pattern': ['A', 'B', '000', 'C', 'A', '000','D','A','C'], 'date': ['11/20/2022', '11/22/2022', '11/23/2022', '11/8/2022', '11/9/2022', '11/14/2022','11/20/2022', '11/22/2022', '11/23/2022']}) m = df2['pattern'] == '000' df2['result'] = (df2[~m].groupby(['patient', m.cumsum()]) .cumcount().add(1) .reindex(df2.index, fill_value=0))
需要从处理后的df2中提取符合如下格式的汇总数据集:
required_dataset = pd.DataFrame({'pattern': ['A,B', 'C,A','D,A,C'], # Pattern按日期排序 'patients': [1,1,1]}) # 唯一患者总数
请实现该数据提取方法。
解决方案
可以通过以下步骤实现需求:
- 统一日期格式:将
date列转换为datetime类型,确保后续排序逻辑准确。 - 生成序列分组标识:基于原代码的
result列,为每个患者的独立序列段生成唯一分组ID。 - 过滤无效行并排序:剔除
pattern为000的分隔行,按患者和日期排序保证序列顺序正确。 - 拼接序列并统计患者数:对每个分组的
pattern进行拼接,再按拼接结果统计对应的唯一患者数量。
具体代码如下:
# 转换date列为日期格式 df2['date'] = pd.to_datetime(df2['date']) # 为每个患者的独立序列段生成分组ID df2['group_id'] = df2.groupby('patient')['result'].transform(lambda x: x.eq(0).cumsum()) # 执行分组拼接与统计 result_df = (df2[df2['pattern'] != '000'] .sort_values(['patient', 'date']) .groupby(['patient', 'group_id']) .agg(pattern=('pattern', ','.join)) .reset_index() .groupby('pattern') .agg(patients=('patient', 'nunique')) .reset_index()) print(result_df)
运行后输出结果:
pattern patients 0 A,B 1 1 C,A 1 2 D,A,C 1
该结果完全匹配需求中的required_dataset格式。
内容的提问来源于stack exchange,提问作者Murali
相关产品推荐
相关产品推荐

