如何用Pandas遍历多层索引表并仅显示每行非空列
Pandas多层索引薪资变更清单实现方案
核心思路
先筛选出存在变更的员工行,再逐行提取非空的差值列,保留员工标识信息,最终生成便于HR交叉核对的精简变更清单。
具体步骤
1. 筛选有变更的员工
首先定位多层索引中Difference层级的所有列,然后筛选出至少有一个差值列非空的员工行:
import pandas as pd # 假设你的多层索引数据框为df # 提取所有Difference层的列 diff_columns = df.columns[df.columns.get_level_values(0) == 'Difference'] # 筛选出至少有一个diff列非空的行(若空值为字符串"",则将判断条件改为df[diff_columns] != "") changed_employees = df[df[diff_columns].notna().any(axis=1)]
2. 生成精简变更报表
逐行处理筛选后的员工数据,只保留员工编号、姓氏以及非空的差值项:
def extract_changes(row): # 初始化结果字典,保留员工基本信息 change_info = { "员工编号": row["员工编号"], "姓氏": row["姓氏"] } # 遍历所有差值列,仅保留非空项 for col in diff_columns: # 兼容空值为字符串的情况:if row[col] != "" and pd.notna(row[col]) if pd.notna(row[col]): # 将多层索引转换为"项目名(diff)"的直观列名 item_name = col[1] change_info[f"{item_name}(diff)"] = row[col] return pd.Series(change_info) # 应用函数生成最终报表 final_report = changed_employees.apply(extract_changes, axis=1).reset_index(drop=True)
3. 可选:生成人工友好的核对格式
如果需要更适合人工阅读的清单格式,可以直接打印每行的变更项:
for _, emp in changed_employees.iterrows(): print(f"【员工信息】编号: {emp['员工编号']}, 姓氏: {emp['姓氏']}") print("变更内容:") for col in diff_columns: if pd.notna(emp[col]) and emp[col] != "": print(f"- {col[1]}: {emp[col]}") print("-" * 30)
示例输出
针对你提供的示例数据,最终报表会自动过滤无变更的Haydn,其余员工仅显示有变动的差值项:
| 员工编号 | 姓氏 | 薪资(diff) | 养老金(diff) |
|---|---|---|---|
| 30 | Jones | NaN | 300 |
| 31 | Smith | 500 | NaN |
| 39 | Brown | 400 | -150 |
若采用打印格式输出,结果为:
【员工信息】编号: 30, 姓氏: Jones 变更内容: - 养老金: 300 ------------------------------ 【员工信息】编号: 31, 姓氏: Smith 变更内容: - 薪资: 500 ------------------------------ 【员工信息】编号: 39, 姓氏: Brown 变更内容: - 薪资: 400 - 养老金: -150 ------------------------------
内容的提问来源于stack exchange,提问作者Tomalak2Pi
相关产品推荐
相关产品推荐

