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
相关产品推荐
相关产品推荐

