检查 pandas 组特定列中的所有记录组成预定义的预期值列表

问题描述 投票:0回答:1

我有一个数据框,我需要检查每个组是否包含完整的例外值。

我尝试按

Patient ID
进行分组并使用
transform
检查每个组是否具有
Y
中的所有 6 个必需值
Inclusion
为:-3, -2, -1, 1, 2, 3否则标记为
N

在 lambda 中使用

all
并不能完全让我实现目标

原版df

患者ID 外科医生身份 手术类型 手术日期 医疗预约日期 包容
1 1 X 2022-09-03 2022-03-04 -3
1 1 X 2022-09-03 2022-05-04 -2
1 1 X 2022-09-03 2022-06-04 -1
1 1 X 2022-09-03 2022-11-04 1
1 1 X 2022-09-03 2022-11-29 2
1 1 X 2022-09-03 2023-01-02 3
2 1 X 2022-10-03 2022-09-01 -2
2 1 X 2022-10-03 2022-09-11 -1
2 1 X 2022-10-03 2022-10-12 1
2 1 X 2022-10-03 2022-10-29 2
2 1 X 2022-10-03 2022-12-12 3

想要的df

患者ID 外科医生身份 手术类型 手术日期 医疗预约日期 包容 包括YN
1 1 X 2022-09-03 2022-03-04 -3
1 1 X 2022-09-03 2022-05-04 -2
1 1 X 2022-09-03 2022-06-04 -1
1 1 X 2022-09-03 2022-11-04 1
1 1 X 2022-09-03 2022-11-29 2
1 1 X 2022-09-03 2023-01-02 3
2 1 X 2022-10-03 2022-09-01 -2 N
2 1 X 2022-10-03 2022-09-11 -1 N
2 1 X 2022-10-03 2022-10-12 1 N
2 1 X 2022-10-03 2022-10-29 2 N
2 1 X 2022-10-03 2022-12-12 3 N
pandas group-by
1个回答
0
投票

如果您必须在 -2 之前先有 -1,在 2 之前先有 1,等等,则使用简单的

groupby.transform
nunique
并检查您是否拥有所有
6
值:

df['IncludeYN'] = np.where(df.groupby(['Patient ID', 'Surg ID'])
                           ['Inclusion'].transform('nunique').eq(6),
                           'Y', 'N')

如果您想与一组特定的值进行比较:

target = {-3, -2, -1, 1, 2, 3}

df['IncludeYN'] = np.where(df.groupby(['Patient ID', 'Surg ID'])
                           ['Inclusion'].transform(lambda x: target.issubset(x)),
                           'Y', 'N')

输出:

    Patient ID  Surg ID Surg Type   Surg Date Medical Appt Date  Inclusion IncludeYN
0            1        1         X  2022-09-03        2022-03-04         -3         Y
1            1        1         X  2022-09-03        2022-05-04         -2         Y
2            1        1         X  2022-09-03        2022-06-04         -1         Y
3            1        1         X  2022-09-03        2022-11-04          1         Y
4            1        1         X  2022-09-03        2022-11-29          2         Y
5            1        1         X  2022-09-03        2023-01-02          3         Y
6            2        1         X  2022-10-03        2022-09-01         -2         N
7            2        1         X  2022-10-03        2022-09-11         -1         N
8            2        1         X  2022-10-03        2022-10-12          1         N
9            2        1         X  2022-10-03        2022-10-29          2         N
10           2        1         X  2022-10-03        2022-12-12          3         N
© www.soinside.com 2019 - 2024. All rights reserved.