You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:51:00