如何重构含ID分组与重复度量行的Pandas DataFrame?
解决Pandas DataFrame实体-度量结构转宽表问题
核心思路
- 标记并填充每个度量行对应的实体名称
- 将日期列转换为行变量(实现日期的纵向展开)
- 将
measure1、measure2转换为列变量,得到每个实体+日期对应一行的结构
具体实现代码
1. 初始化数据并预处理空值
import pandas as pd data = { 'ID': ['John Doe - ABC', 'measure1', 'measure2', 'Apple', 'measure1', 'measure2'], 'Oct-22': ['', 421, 312,'', 421, 312], 'Nov-22': ['', 421, 312,'', 421, 312], 'Dec-22': ['', 421, 312,'', 421, 312], 'Jan-23': ['', 421, 312,'', 421, 312] } df = pd.DataFrame(data) # 将空字符串转为NaN,便于后续处理 df = df.replace('', pd.NA)
2. 关联度量行与所属实体
# 标记实体行(ID不是measure1/measure2的行),并将实体名称填充到后续度量行 df['entity'] = df['ID'].where(~df['ID'].isin(['measure1', 'measure2'])) df['entity'] = df['entity'].ffill() # 过滤掉无数据的实体行 df = df[df['ID'].isin(['measure1', 'measure2'])]
3. 转换日期列为行变量
# 把横向的日期列转为纵向的MMM-YY列,同时提取度量值 df_melted = df.melt(id_vars=['entity', 'ID'], var_name='MMM-YY', value_name='value')
4. 转换度量为列变量,得到最终结构
# 按实体和日期分组,将measure1、measure2转为列 final_df = df_melted.pivot(index=['entity', 'MMM-YY'], columns='ID', values='value').reset_index() # 调整列名,符合需求格式 final_df = final_df.rename(columns={'entity': 'ID'}) final_df.columns.name = None
最终结果
运行上述代码后,final_df的结构如下:
ID MMM-YY measure1 measure2 0 Apple Oct-22 421 312 1 Apple Nov-22 421 312 2 Apple Dec-22 421 312 3 Apple Jan-23 421 312 4 John Doe - ABC Oct-22 421 312 5 John Doe - ABC Nov-22 421 312 6 John Doe - ABC Dec-22 421 312 7 John Doe - ABC Jan-23 421 312
内容的提问来源于stack exchange,提问作者harry
相关产品推荐
相关产品推荐

