如何用通用方法调整Pandas DataFrame列布局并自定义列名
问题
我有如下所示的DataFrame:
Actual Expected F00000191U F00000191U 2022-09-30 2022-12-20 0.546437 0.546437638135 F00000191U F00000191U 2022-09-30 2022-12-20 F00000191U F00000191U 2022-09-30 2022-12-20 0.546437 0.517306000000000 F00000QAXU F00000QAXU 2022-02-28 2022-07-31
其中字母数字串是唯一的Entity ID作为键,日期与十进制数值均关联该实体ID。例如,F00000191U对应实际日期2022-09-30、实际值0.546437,旁侧为对应预期值。该数据是从某DataFrame提取的不匹配项,我希望将其转换为如下规整横向布局:
Actual Entity ID | Actual start date |Actual Value |Expected Entity ID |Expected date |Expected val F00000191U |2022-09-30 |0.546437 |F00000191U |2022-12-20 |0.546437638135
作为Pandas新手,想咨询是否有通用方法实现该格式转换?
解决方法
可以通过分组重塑实现,核心是先识别实体组的边界,再将每组的多行数据转成横向字段,具体步骤如下:
标记实体组:
通过正则匹配识别Entity ID行,生成组ID将连续的关联行归为一组:import pandas as pd import re # 假设原始数据已加载为df # df = pd.read_csv(...) 或其他方式获取 # 判断是否为Entity ID:匹配字母+数字格式 is_entity = df['Actual'].str.match(r'^[A-F0-9]+$', na=False) # 生成组ID:每次遇到Entity ID就新增一个组 df['group_id'] = is_entity.cumsum()转置每组数据:
对每个组进行转置,合并Actual和Expected的字段并调整列名:# 分组后转置,将行转为列 grouped = df.groupby('group_id').apply( lambda x: x.set_index(pd.Series(['Entity ID', 'start date', 'Value'], index=x.index)) ).unstack(0) # 调整列名,区分Actual和Expected grouped.columns = [f'{col[0]} {col[1]}' for col in grouped.columns] # 重命名列名匹配目标格式 grouped = grouped.rename(columns={ 'Expected start date': 'Expected date', 'Expected Value': 'Expected val' }) # 重置索引得到最终规整表格 result = grouped.reset_index(drop=True)处理缺失值:
对于缺少数值的组(比如最后一组F00000QAXU),结果中对应字段会显示NaN,可按需填充:# 可选:用空字符串填充缺失值 result = result.fillna('')
运行后即可得到目标格式的规整DataFrame。
内容的提问来源于stack exchange,提问作者Pratik
相关产品推荐
相关产品推荐

