GroupBy后基于组内条件的跨组脱敏数据处理问询
实现跨组脱敏(Cross Group Redaction)
需求说明
按id分组,若组内存在redact列非空的脱敏记录,则将组内其他redact为空的行标记为crossGroup。你已完成value < 4的条件脱敏,需补充同组其他行的标记逻辑。
初始表格
| id | value | redact |
|---|---|---|
| A | 3 | N < 4 |
| A | 5 | |
| B | 6 | |
| B | 6 | |
| C | 5 | |
| C | 3 | N < 4 |
| D | 5 | |
| D | 6 | |
| E | 2 | N < 4 |
| E | 8 |
目标表格
| id | value | redact |
|---|---|---|
| A | 3 | N < 4 |
| A | 5 | crossGroup |
| B | 6 | |
| B | 6 | |
| C | 5 | crossGroup |
| C | 3 | N < 4 |
| D | 5 | |
| D | 6 | |
| E | 2 | N < 4 |
| E | 8 | crossGroup |
解决方案(以Pandas为例)
通过分组标记+逐行判断实现跨组脱敏:
代码实现
import pandas as pd # 构造初始数据(替换为你的实际数据读取逻辑) data = { 'id': ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D', 'E', 'E'], 'value': [3, 5, 6, 6, 5, 3, 5, 6, 2, 8], 'redact': ['N < 4', '', '', '', '', 'N < 4', '', '', 'N < 4', ''] } df = pd.DataFrame(data) # 1. 标记每个组是否存在脱敏记录 df['has_redact'] = df.groupby('id')['redact'].transform(lambda x: x.str.strip().ne('').any()) # 2. 更新redact列:空值且组内有脱敏记录的行标记为crossGroup df['redact'] = df.apply( lambda row: 'crossGroup' if (row['has_redact'] and row['redact'].strip() == '') else row['redact'], axis=1 ) # 可选:删除辅助列 df = df.drop('has_redact', axis=1) print(df)
逻辑说明
groupby('id')['redact'].transform(...):对每个分组计算是否存在非空脱敏记录,结果广播到组内所有行,生成辅助标记列apply逐行判断:若当前组存在脱敏记录且当前行redact为空,则替换为crossGroup,否则保留原内容
内容的提问来源于stack exchange,提问作者midknightowl
相关产品推荐
相关产品推荐

