如何用Pandas对DataFrame重复ID的指定列进行同值掩码处理?
如何对Pandas DataFrame中同一ID的多列进行一致掩码处理?
问题描述
现有包含个人信息的Pandas DataFrame,存在ID重复的记录(同一ID对应人员可能有不同职业),示例数据如下:
ID Name Street Birth Job Approved? 1 Paulo Av. 15, 7 1989-14-07 Carpinter Yes 2 Maria Stret Sky 2 1989-01-01 Driver Yes 3 John Stret Sky 3 2000-01-02 Mechanic Yes 1 Paulo Av. 15, 7 1989-14-07 Mechanic Yes 2 Maria Stret Sky 2 1989-01-01 Carpinter Yes 4 Peter Ocen Avenue 2001-01-03 Soldier Yes
需要对Name、Street、Birth、Job列做掩码处理,要求同一ID对应的列使用相同掩码值,且掩码值需与原列数据类型一致,处理后示例如下:
ID Name Street Birth Job Approved? 1 Fake1 Street1 2000-01-01 Job1 Yes 2 Fake2 Street2 2000-01-02 Job2 Yes 3 Fake3 Street3 2000-01-03 Job3 Yes 1 Fake1 Street1 2000-01-01 Job1 Yes 2 Fake2 Street2 2000-01-02 Job2 Yes 4 Fake4 Street4 2000-01-03 Job4 Yes
最优实现方法
以下是高效且易维护的实现方案,核心思路是为每个唯一ID建立各列的掩码映射,再通过向量化操作批量替换原数据,既保证同一ID的掩码一致性,也维护数据类型:
完整代码示例
import pandas as pd # 1. 创建示例DataFrame data = { 'ID': [1, 2, 3, 1, 2, 4], 'Name': ['Paulo', 'Maria', 'John', 'Paulo', 'Maria', 'Peter'], 'Street': ['Av. 15, 7', 'Stret Sky 2', 'Stret Sky 3', 'Av. 15, 7', 'Stret Sky 2', 'Ocen Avenue'], 'Birth': ['1989-14-07', '1989-01-01', '2000-01-02', '1989-14-07', '1989-01-01', '2001-01-03'], 'Job': ['Carpinter', 'Driver', 'Mechanic', 'Mechanic', 'Carpinter', 'Soldier'], 'Approved?': ['Yes'] * 6 } df = pd.DataFrame(data) # 先将Birth列转为日期类型(处理原数据中的无效日期) df['Birth'] = pd.to_datetime(df['Birth'], errors='coerce') # 2. 为每个唯一ID生成掩码映射 unique_ids = df['ID'].unique() # 建立各列的掩码字典 mask_mappings = { 'Name': {id_val: f'Fake{i+1}' for i, id_val in enumerate(unique_ids)}, 'Street': {id_val: f'Street{i+1}' for i, id_val in enumerate(unique_ids)}, 'Birth': {id_val: pd.to_datetime(f'2000-01-{str(i+1).zfill(2)}') for i, id_val in enumerate(unique_ids)}, 'Job': {id_val: f'Job{i+1}' for i, id_val in enumerate(unique_ids)} } # 3. 批量替换原列数据 for col, mapping in mask_mappings.items(): df[col] = df['ID'].map(mapping) # 查看处理后结果 print(df)
方案优势
- 高效性:使用
map进行向量化替换,比逐行遍历或apply性能提升显著,适合大规模数据集。 - 一致性:基于ID建立映射,确保同一ID的所有记录对应列使用完全相同的掩码值。
- 类型匹配:针对
Birth列专门生成日期类型的掩码,严格匹配原列数据类型,避免类型混乱。 - 可扩展性:若后续需要新增掩码列,只需在
mask_mappings中添加对应规则即可。
内容的提问来源于stack exchange,提问作者Paulo Cortez
相关产品推荐
相关产品推荐

