基于另一DataFrame的条件实现Pandas fillna的技术方案
需求说明与实现方案
原始数据
表1(待填充数据)
| ID | Condition | Access1 | Access2 |
|---|---|---|---|
| 1 | aa | nan | nan |
| 2 | aa | nan | nan |
| 3 | bb | nan | nan |
| 4 | bb | nan | nan |
| 5 | aa | nan | nan |
| 6 | bb | nan | nan |
| 7 | aa | nan | nan |
表2(权限映射表)
| 姓名 | Condition | Accessor1 | Accessor2 |
|---|---|---|---|
| John | aa | Yes | No |
| Mary | aa | No | Yes |
| Bob | aa | Yes | Yes |
| Ben | bb | Yes | Yes |
| Peter | bb | No | Yes |
填充规则
- 表1的
Access1字段需匹配表2中同Condition且Accessor1为Yes的用户,Access2字段匹配同Condition且Accessor2为Yes的用户 - 若某用户同时拥有两项权限(如Bob、Ben),可同时填入对应记录的
Access1和Access2 - 当同Condition的符合条件用户遍历完毕后,循环复用用户列表(如aa组的第3条记录ID=5,重新从John、Mary开始匹配)
预期结果表
| ID | Condition | Access1 | Access2 |
|---|---|---|---|
| 1 | aa | John | Mary |
| 2 | aa | Bob | Bob |
| 3 | bb | Ben | Ben |
| 4 | bb | Ben | Peter |
| 5 | aa | John | Mary |
| 6 | bb | Ben | Ben |
| 7 | aa | Bob | Bob |
Pandas实现方案
代码实现
import pandas as pd # 构造原始数据 df1 = pd.DataFrame({ 'ID': [1,2,3,4,5,6,7], 'Condition': ['aa','aa','bb','bb','aa','bb','aa'], 'Access1': [pd.NA]*7, 'Access2': [pd.NA]*7 }) df2 = pd.DataFrame({ '姓名': ['John','Mary','Bob','Ben','Peter'], 'Condition': ['aa','aa','aa','bb','bb'], 'Accessor1': ['Yes','No','Yes','Yes','No'], 'Accessor2': ['No','Yes','Yes','Yes','Yes'] }) # 为每个Condition生成可循环的权限用户列表 access1_candidates = df2[df2['Accessor1'] == 'Yes'].groupby('Condition')['姓名'].apply(list).to_dict() access2_candidates = df2[df2['Accessor2'] == 'Yes'].groupby('Condition')['姓名'].apply(list).to_dict() # 定义分组填充函数 def fill_group_records(group): cond = group['Condition'].iloc[0] a1_list = access1_candidates[cond] a2_list = access2_candidates[cond] group_len = len(group) # 生成循环索引(取模实现复用) a1_indices = [i % len(a1_list) for i in range(group_len)] a2_indices = [i % len(a2_list) for i in range(group_len)] # 填充对应字段 group['Access1'] = [a1_list[idx] for idx in a1_indices] group['Access2'] = [a2_list[idx] for idx in a2_indices] return group # 按Condition分组执行填充 result_df = df1.groupby('Condition', group_keys=False).apply(fill_group_records) # 查看结果 print(result_df)
逻辑说明
- 从表2中筛选出符合Access1、Access2权限的用户,按Condition分组存储为可复用的列表字典
- 对表1按Condition分组后,通过取模运算为每组的每条记录生成循环索引,实现用户列表的循环复用
- 将索引对应的用户值批量填入表1的
Access1和Access2字段
内容的提问来源于stack exchange,提问作者user23638854
相关产品推荐
相关产品推荐

