我有一个数据框,我需要检查每个组是否包含完整的例外值。
我尝试按
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 |
如果您必须在 -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