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

Pandas宽表转长表:按id分组保留全列并生成透视列的方案求助

问题原因

你此前使用的代码逻辑冗余且硬编码了stubnames = ['q122','q222'],漏掉了q322等其他日期前缀,因此无法覆盖全部列。

可行解法

通过先规整列名、再调用wide_to_long的方案实现需求,适配任意数量的日期列,无需硬编码所有日期值,完整代码如下:

import pandas as pd

# 自定义列名转换规则,将原列名 日期+后缀 转换为 后缀_日期 格式,适配wide_to_long逻辑
def rename_col(col):
    if col in ['s1', 's2', 'id']:
        return col
    # 匹配后缀为c2/a2的列
    if col.endswith('c2'):
        return f'c2_{col[:-2]}'
    elif col.endswith('a2'):
        return f'a2_{col[:-2]}'
    # 匹配后缀为c/a的列
    elif col.endswith('c'):
        return f'c_{col[:-1]}'
    elif col.endswith('a'):
        return f'a_{col[:-1]}'
    return col

# 重命名数据集列
df_renamed = df.rename(columns=rename_col)

# 宽转长处理
df_long = pd.wide_to_long(
    df_renamed,
    stubnames=['c', 'a', 'c2', 'a2'],
    i=['s1', 's2', 'id'],
    j='date',
    sep='_',
    suffix='.*'
).reset_index()

# 重命名为目标列名
df_result = df_long.rename(columns={
    'c': 'consumed1',
    'a': 'avail1',
    'c2': 'consumed2',
    'a2': 'avail2'
})

# 按id、日期排序,符合输出习惯
df_result = df_result.sort_values(by=['id', 'date']).reset_index(drop=True)

如果原始数据集有更多符合命名规则的列,只需微调rename_col函数内的后缀匹配逻辑即可覆盖全部列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:36:02