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

Pandas实现表头列值拼接、透视转换及标签计数问题咨询

实现方案

你的整体思路方向是正确的,只需要补充几个遗漏的调整点即可:

  1. 宽转长时需要把date也加入索引,避免丢失年份维度
  2. 要按照季度对应的数值重复对应次数的行,实现“数值为2生成2条记录”的需求
  3. 计数时分组维度限定为id/type/拼接后的日期即可,不需要全列分组

完整可运行代码

import pandas as pd

# 构造测试用原数据
df = pd.DataFrame({
    'id': ['aa', 'aa', 'aa', 'bb'],
    'type': ['hi', 'hi', 'ok', 'hi'],
    'date': [2022, 2023, 2022, 2024],
    'Q1': [1, 1, 1, 3],
    'Q2': [2, 1, 0, 0]
})

# 步骤1:宽表转长表,过滤数值为0的无效行
df_long = df.set_index(['id', 'type', 'date'])\
            .stack()\
            .reset_index(name='cnt')\
            .rename(columns={'level_3': 'quarter'})
df_long = df_long[df_long['cnt'] > 0]

# 步骤2:按cnt数值重复对应次数的行
df_expand = df_long.loc[df_long.index.repeat(df_long['cnt'])].reset_index(drop=True)

# 步骤3:生成目标格式的日期和count字段
df_expand['date'] = df_expand['quarter'] + ' ' + df_expand['date'].astype(str)
df_expand['count'] = df_expand['type'] + df_expand.groupby(['id', 'type', 'date'])\
                                                  .cumcount()\
                                                  .add(1)\
                                                  .astype(str)\
                                                  .str.zfill(2)

# 输出目标列
df_result = df_expand[['id', 'type', 'date', 'count']]
print(df_result)

运行后输出结果和你给出的期望输出完全一致。

内容的提问来源于stack exchange,提问作者Lynn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:06:04