Pandas实现表头列值拼接、透视转换及标签计数问题咨询
实现方案
你的整体思路方向是正确的,只需要补充几个遗漏的调整点即可:
- 宽转长时需要把
date也加入索引,避免丢失年份维度 - 要按照季度对应的数值重复对应次数的行,实现“数值为2生成2条记录”的需求
- 计数时分组维度限定为
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
相关产品推荐
相关产品推荐

