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

如何用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)
30JonesNaN300
31Smith500NaN
39Brown400-150

若采用打印格式输出,结果为:

【员工信息】编号: 30, 姓氏: Jones
变更内容:
- 养老金: 300
------------------------------
【员工信息】编号: 31, 姓氏: Smith
变更内容:
- 薪资: 500
------------------------------
【员工信息】编号: 39, 姓氏: Brown
变更内容:
- 薪资: 400
- 养老金: -150
------------------------------

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:30:52