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

如何重构含ID分组与重复度量行的Pandas DataFrame?

解决Pandas DataFrame实体-度量结构转宽表问题

核心思路

  1. 标记并填充每个度量行对应的实体名称
  2. 将日期列转换为行变量(实现日期的纵向展开)
  3. 将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:05:28