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
相关产品推荐
相关产品推荐

