如何扁平化Pandas DataFrame:实现单员工单行展示
解决方案
可以通过以下步骤实现需求:
为每个员工的调动记录添加序号
按employee_id分组,给每组内的记录分配从1开始的递增序号,后续用这个序号生成对应列名。重塑数据结构
使用pivot方法将长格式数据转为宽格式,以employee_id为索引,序号为列层级,company和transfer_date为值。调整列名格式
将列的层级合并为companyN和transfer_dateN的格式,同时把employee_id从索引转回普通列。填充缺失值
用NaN填充无对应调动记录的列(pandas默认会自动填充)。
完整代码示例
import pandas as pd # 构造示例数据 data = { 'employee_id': [1743, 1743, 1743, 1744], 'company': ['cmp1', 'cmp2', 'cmp3', 'cmp5'], 'transfer_date': ['2018-04-30', '2018-10-05', '2019-10-23', '2022-11-11'] } df = pd.DataFrame(data) # 添加调动序号 df['seq'] = df.groupby('employee_id').cumcount() + 1 # 重塑数据 pivoted = df.pivot(index='employee_id', columns='seq', values=['company', 'transfer_date']) # 调整列名格式 pivoted.columns = [f'{col[0]}{col[1]}' for col in pivoted.columns] result = pivoted.reset_index() # 填充缺失值(可选,默认已为NaN) result = result.fillna(pd.NA) print(result)
输出结果
employee_id company1 transfer_date1 company2 transfer_date2 company3 transfer_date3 0 1743 cmp1 2018-04-30 cmp2 2018-10-05 cmp3 2019-10-23 1 1744 cmp5 2022-11-11 NaN NaN NaN NaN
扩展说明
如果员工新增第4次调动记录,只需在原始DataFrame中添加对应行,代码会自动生成company4和transfer_date4列——cumcount()会自动识别新的序号,pivot也会自动扩展列数,无需修改核心逻辑。
内容的提问来源于stack exchange,提问作者Kritz
相关产品推荐
相关产品推荐

