从多级索引DataFrame提取指定列时遭遇长度不匹配ValueError
解决从多级索引DataFrame提取列时的ValueError问题
错误根源
你触发的ValueError来自这两行无效代码:
pairs = pd.DataFrame() pairs.columns = ['Date', ticker1, ticker2]
空DataFrame没有任何列(轴元素数为0),但你试图给它分配3个列名,长度不匹配直接引发报错。更关键的是这两行完全多余——后面你通过loc和merge重新赋值了pairs,之前的空DataFrame操作没有任何实际作用。
修正后的基础版函数
移除无效的初始化代码,直接按筛选-合并的逻辑编写:
def pairs(ticker1, ticker2): # 分别筛选两个ticker的数据 df_ticker1 = data_df.loc[data_df['Ticker'] == ticker1] df_ticker2 = data_df.loc[data_df['Ticker'] == ticker2] # 按Date合并,自动保留共同日期的记录 merged_result = df_ticker1.merge(df_ticker2, on='Date', suffixes=(f'_{ticker1}', f'_{ticker2}')) # 重命名列名符合预期结构 merged_result.columns = ['Date', ticker1, ticker2] return merged_result
适配多级索引场景的版本
如果你的data_df是**(Date, Ticker)**格式的多级索引结构,需要调整筛选逻辑为按索引取值:
def pairs(ticker1, ticker2): # 从多级索引中提取指定ticker的数据 df_ticker1 = data_df.xs(ticker1, level='Ticker') df_ticker2 = data_df.xs(ticker2, level='Ticker') # 基于Date索引合并,效率更高 merged_result = df_ticker1.join(df_ticker2, lsuffix=f'_{ticker1}', rsuffix=f'_{ticker2}') # 重置索引并调整列名 merged_result.reset_index(inplace=True) merged_result.columns = ['Date', ticker1, ticker2] return merged_result
你第二版尝试代码的问题
你写的第二版代码存在两处明显错误:
- 拼写错误:
data.df应为data_df - 逻辑错误:
data_df.ticker1.isin(...)中的ticker1不是列名,正确的筛选逻辑应该是针对Ticker列,且需要转成宽格式才能得到两列结构:
# 筛选目标ticker的行,再转成宽格式 pairs_df = data_df[data_df['Ticker'].isin([ticker1, ticker2])].pivot( index='Date', columns='Ticker', values='Price' # 替换为你实际的数值列名 ).reset_index() pairs_df.columns = ['Date', ticker1, ticker2]
内容的提问来源于stack exchange,提问作者Sean Simms
相关产品推荐
相关产品推荐

