You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:03:34