Python-Pandas中DataFrame追加失败问题求助
嘿,这个Assertion Error我之前在处理多股票财务数据拼接时碰到过好多次,确实是不同股票对应的合并后DataFrame列结构不一致导致的——有的股票的报表(资产负债表/利润表/现金流量表)多了或少了某些字段,循环到后面时,新生成的df列数/列名和总df对不上,就触发了断言错误。
下面给你一套具体的解决步骤,亲测有效:
解决步骤:统一所有DataFrame的列结构
1. 先提前收集所有可能的列名全集
在开始循环拼接前,先遍历所有股票,把三个报表里出现过的所有列都收集起来,定义一个“通用列模板”:
import pandas as pd import numpy as np # 替换成你的实际股票代码列表 tickers = ["AAPL", "MSFT", "GOOG"] all_columns = set() # 遍历所有ticker,收集所有列名 for ticker in tickers: # 替换成你获取三个报表df的实际逻辑 bs_df = get_balance_sheet(ticker) income_df = get_income_statement(ticker) cash_df = get_cash_flow(ticker) # 把三个df的列都加入全集 all_columns.update(bs_df.columns) all_columns.update(income_df.columns) all_columns.update(cash_df.columns) # 转成列表,方便后续使用 all_columns = list(all_columns)
2. 为每个股票的报表补全缺失列
在拼接单只股票的三个报表前,先让每个报表df都包含所有通用列,缺失的列用NaN填充,这样拼接后的单股票df列结构就完全一致了:
# 初始化总DataFrame total_df = pd.DataFrame() for ticker in tickers: # 获取三个报表df bs_df = get_balance_sheet(ticker) income_df = get_income_statement(ticker) cash_df = get_cash_flow(ticker) # 补全每个df的列,缺失列填充NaN bs_df = bs_df.reindex(columns=all_columns, fill_value=np.nan) income_df = income_df.reindex(columns=all_columns, fill_value=np.nan) cash_df = cash_df.reindex(columns=all_columns, fill_value=np.nan) # 拼接三个报表(行拼接用axis=0,列拼接请改成axis=1) ticker_combined = pd.concat([bs_df, income_df, cash_df], axis=0) # 务必添加ticker标识列,方便后续区分数据所属股票 ticker_combined["ticker"] = ticker # 追加到总df(用concat比废弃的append更稳定) total_df = pd.concat([total_df, ticker_combined], axis=0)
3. 调试排查:找出列不匹配的具体差异
如果还是报错,就在循环里加一段调试代码,打印每次生成的单股票df和总df的列名,精准定位差异:
for ticker in tickers: # ... 前面的获取和补全步骤 ... ticker_combined = pd.concat([bs_df, income_df, cash_df], axis=0) ticker_combined["ticker"] = ticker # 调试输出列信息 print(f"正在处理股票:{ticker}") print(f"当前股票df列名:{sorted(ticker_combined.columns)}") if not total_df.empty: print(f"总df列名:{sorted(total_df.columns)}") # 找出列差异 missing_in_ticker = set(total_df.columns) - set(ticker_combined.columns) missing_in_total = set(ticker_combined.columns) - set(total_df.columns) if missing_in_ticker: print(f"当前股票df缺失总df的列:{missing_in_ticker}") if missing_in_total: print(f"当前股票df多了总df没有的列:{missing_in_total}") # 追加到总df total_df = pd.concat([total_df, ticker_combined], axis=0)
额外提醒:别用append方法
注意pandas的df.append()已经被官方废弃了,用pd.concat()来拼接DataFrame不仅更稳定,还能避免一些隐式的错误。
如果你的需求是把同一只股票的三个报表按列拼接(比如把资产负债表、利润表的列合并到同一行),那还要确保三个报表的索引是对齐的(比如都是日期或者财务指标名称),再用同样的补全列方法处理。
内容的提问来源于stack exchange,提问作者user9532692
相关产品推荐
相关产品推荐

