在PySpark中实现员工层级结构列的顺序反转
反转员工层级DataFrame的层级列
核心思路
- 前3列「Name」「Position」「Age」直接保留,不做改动
- 把所有以「Pos」开头的列(从Pos1到Pos30)单独提取,按行处理:先过滤空值,反转剩余值的顺序,再补空值对齐原列数
- 最后将处理后的层级列与前3列合并
代码实现
先导入所需库:
import pandas as pd import numpy as np
编写处理函数:
def reverse_hierarchy(df): # 拆分核心列和层级列,确保层级列按Pos1到Pos30排序 core_cols = ["Name", "Position", "Age"] hierarchy_cols = sorted([col for col in df.columns if col.startswith("Pos")], key=lambda x: int(x[3:])) # 逐行反转层级列的非空值,补空值保持列数一致 reversed_hierarchy = df[hierarchy_cols].apply( lambda row: pd.Series( list(reversed(row.dropna())) + [np.nan]*(len(hierarchy_cols)-len(row.dropna())) ), axis=1 ) reversed_hierarchy.columns = hierarchy_cols # 合并核心列与处理后的层级列 return pd.concat([df[core_cols], reversed_hierarchy], axis=1)
示例测试
构造样例数据验证效果:
# 生成包含Pos1到Pos30的原始数据 sample_data = { "Name": ["Raj", "Alice"], "Position": ["Engineer", "Manager"], "Age": [28, 35], "Pos1": ["Team Lead", "Director"], "Pos2": ["Department Head", np.nan], "Pos3": ["CEO", np.nan], **{f"Pos{i}": np.nan for i in range(4, 31)} } original_df = pd.DataFrame(sample_data) # 执行处理 result_df = reverse_hierarchy(original_df) print(result_df)
处理后:
- Raj的层级列变为:Pos1=CEO,Pos2=Department Head,Pos3=Team Lead,Pos4到Pos30均为null
- Alice的层级列变为:Pos1=Director,其余层级列均为null
注意事项
- 必须先对层级列按Pos1到Pos30排序,避免原始数据列顺序混乱导致反转结果错误
- 反转仅针对非空值,补空值保证列数与原数据一致,不破坏DataFrame结构
内容的提问来源于stack exchange,提问作者RickyS
相关产品推荐
相关产品推荐

