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

Pandas实现3个DataFrame数据对账,将用户所属组映射为对应角色

Pandas高效实现对账逻辑方案

核心思路是将两个宽表(df_groups、df_roles)转换为可关联的长表映射,通过向量化关联操作得到最终结果,完全避免嵌套循环,性能可轻松覆盖业务规模。

实现步骤

  • 处理用户组表:将宽格式的df_groups转换为[用户邮箱, 所属用户组]的映射长表,删除空的无效记录
  • 处理角色关联表:将角色作为行索引的df_roles转换为[角色名称, 关联用户组]的映射长表,仅保留角色与组关联为True的记录
  • 关联两张映射表:通过用户组字段关联两个映射,得到[用户邮箱, 对应角色]的结果,可按需选择保留单条多角色、或者多名单角色的输出格式
  • 关联回原始用户表:将结果填充回df_users的Roles字段

完整代码实现

import pandas as pd

# ---------------------- 1. 转换用户组表为用户-组映射 ----------------------
# df_groups为原始用户组宽表
user_group_mapping = df_groups.melt(
    var_name="Group", 
    value_name="Email"
).dropna(subset=["Email"]).reset_index(drop=True)

# ---------------------- 2. 转换角色表为角色-组映射 ----------------------
# df_roles原始角色关联表,行索引为角色名
role_group_mapping = df_roles.reset_index(names="Role")\
    .melt(
        id_vars="Role", 
        var_name="Group", 
        value_name="is_linked"
    )\
    .query("is_linked == True")\
    .drop(columns=["is_linked"])\
    .reset_index(drop=True)

# ---------------------- 3. 关联得到用户-角色对应关系 ----------------------
# 输出为一个邮箱对应多条角色记录的格式
user_role_detail = user_group_mapping.merge(
    role_group_mapping, 
    on="Group", 
    how="inner"
)[["Email", "Role"]].drop_duplicates().rename(columns={"Role": "Roles"})

# 可选:输出为一个邮箱对应逗号拼接角色的格式
user_role_merged = user_role_detail.groupby("Email")["Roles"]\
    .apply(",".join)\
    .reset_index()

# ---------------------- 4. 填充回原始用户表 ----------------------
# 多记录格式结果
df_users_multi_output = df_users[["Email"]].merge(user_role_detail, on="Email", how="left")
# 合并角色格式结果
df_users_merged_output = df_users[["Email"]].merge(user_role_merged, on="Email", how="left")

内容的提问来源于stack exchange,提问作者clines

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:39:01