如何修复向Pandas DataFrame追加不同长度列时的报错?
修复"Columns must be same length as key"报错方案
你遇到的这个报错,核心原因是各股票数据的日期范围不一致,导致提取的Adjusted_close列长度各不相同,而空的portfolio DataFrame没有预设索引,直接赋值时pandas没法匹配行长度,所以抛出了这个错误。下面给你两种实用的修复方案:
方案1:用pd.concat批量合并(推荐)
把所有股票的Adjusted_close列整理成字典,用concat按日期索引自动对齐合并,不同日期的缺口会自动填充NaN,代码更简洁:
import pandas as pd # 替换成你的50家公司股票代码列表 tickers = ["AAPL", "MSFT", "GOOG", ...] adjusted_close_dict = {} for ticker in tickers: # 替换成你的股票数据下载/读取逻辑(比如yfinance或本地CSV) stock_df = pd.read_csv(f"{ticker}_stock_data.csv") # 将日期设为索引,确保合并时按日期对齐 stock_df["Date"] = pd.to_datetime(stock_df["Date"]) stock_df.set_index("Date", inplace=True) # 提取Adjusted_close列存入字典,键为股票代码 adjusted_close_dict[ticker] = stock_df["Adjusted_close"] # 按列合并所有数据,自动对齐日期索引 portfolio = pd.concat(adjusted_close_dict, axis=1) # 把列名设置为股票代码(可选,让表格更直观) portfolio.columns = tickers
方案2:手动统一索引后逐步添加列
如果需要分步构建portfolio,可以先收集所有股票的日期并集作为统一索引,再逐个添加列并对齐:
import pandas as pd from functools import reduce tickers = ["AAPL", "MSFT", "GOOG", ...] all_dates = [] # 第一步:收集所有股票的日期,生成日期并集 for ticker in tickers: stock_df = pd.read_csv(f"{ticker}_stock_data.csv") # 转换日期格式并收集 all_dates.append(pd.to_datetime(stock_df["Date"])) # 合并所有日期并去重、排序 combined_dates = pd.Series(reduce(lambda x, y: x.union(y), all_dates)).sort_values() # 用统一日期初始化portfolio portfolio = pd.DataFrame(index=combined_dates) # 第二步:逐个添加Adjusted_close列,对齐索引 for ticker in tickers: stock_df = pd.read_csv(f"{ticker}_stock_data.csv") stock_df["Date"] = pd.to_datetime(stock_df["Date"]) stock_df.set_index("Date", inplace=True) # 对齐到统一日期索引,缺失日期填充NaN portfolio[ticker] = stock_df["Adjusted_close"].reindex(combined_dates)
补充说明
两种方案的核心都是通过日期索引对齐,让每一列的长度和portfolio的行长度保持一致,从根本上解决长度不匹配的问题。如果不需要保留所有日期,也可以选择用日期交集(把union改成intersection),只保留所有股票都有的日期数据。
内容的提问来源于stack exchange,提问作者Mahmoud Abdel-Rahman
相关产品推荐
相关产品推荐

