使用pd.wide_to_long以括号为分隔符返回空DataFrame的问题
解决pd.wide_to_long提取括号内内容的问题
正确转换代码
np.random.seed(0) df = pd.DataFrame({'A(weekly_2010)': np.random.rand(3), 'A(weekly_2011)': np.random.rand(3), 'B(weekly_2010)': np.random.rand(3), 'B(weekly_2011)': np.random.rand(3), 'X' : np.random.randint(3, size=3)}) df['id'] = df.index # 生成目标格式DataFrame的正确代码 df1 = pd.wide_to_long(df, stubnames=['A', 'B'], i=['id', 'X'], j='year', sep='', suffix=r'\(.+\)').reset_index()
参数说明
sep='':列名中A/B(stubname)与括号包裹的年份部分直接相连,无额外分隔符,因此设置为空字符串。suffix=r'\(.+\)':用正则匹配整个括号包裹的内容,确保pandas能正确识别(weekly_2010)这类字符串作为year列的值。i=['id', 'X']:将X和id作为标识列,保证转换后这两列的内容能正确对应每行的A/B数值;最后用reset_index()展开为你需要的扁平化结构。
之前写法失败的原因
- 尝试的
sep='()'、sep='\\()'等写法错误将括号作为分隔符,但实际列名中A/B后直接跟左括号,不存在()格式的分隔符,导致pandas无法匹配拆分规则,返回空DataFrame。 - 交换
i和j参数会让pandas去查找名为year的列,而原数据中无此列,因此触发KeyError。
内容的提问来源于stack exchange,提问作者Karina
相关产品推荐
相关产品推荐

