Pandas按列名堆叠多组列到目标列,解决wide_to_long与stack报错
问题原因及解决方案
方案1:修复wide_to_long实现
原代码返回0行的原因是pd.wide_to_long默认将j参数解析为整数类型,你的后缀为F开头的字符串,类型不匹配导致无法匹配列。添加dtype=str参数指定j为字符串类型即可解决:
result = pd.wide_to_long( df, stubnames=['AA', 'BB'], i='id', j='suffix', # 保留后缀标识列,可后续按需处理 sep='_', dtype=str # 关键参数:指定后缀列为字符串类型,匹配F开头的命名规则 ).reset_index().sort_values(['id', 'suffix'])
方案2:修复多级索引+stack实现
原代码仅返回2列的原因是你在reset_index时主动删除了level=1对应的后缀标识列,丢失了分组信息。修复后代码如下:
df_temp = df.set_index('id') # 拆分列名生成多级索引,n=1避免后缀内含下划线时拆分错误 df_temp.columns = pd.MultiIndex.from_tuples( df_temp.columns.str.split('_', n=1).tolist(), names=['prefix', 'suffix'] ) # stack时可通过dropna参数控制是否过滤AA、BB全为NaN的行 result = df_temp.stack(level='suffix', dropna=False).reset_index()
结果说明
两种方案输出的结果结构完全一致,包含4列:id、suffix、AA、BB,默认总数据量为130 * 175 = 22750行,符合列堆叠需求。如果不需要保留AA、BB全为空的行,可将dropna参数改为True自动过滤无效行。
内容的提问来源于stack exchange,提问作者Helena
相关产品推荐
相关产品推荐

