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

如何在Pandas中提取两单元格间条目最多列的区间内容合并财务报表

财务报表条目合并Pandas实现方案

问题说明

你当前遇到两个核心问题:

  1. 链式索引触发SettingWithCopyWarning警告:你使用df['Consolidated'].iloc[1]属于链式索引操作,Pandas无法确认修改的是原DataFrame还是视图副本,因此抛出警告。
  2. 区间匹配逻辑未实现:需要按分组标题拆分区间,取各列对应区间最长的条目列表拼接得到汇总列。

实现代码

import pandas as pd
import numpy as np

# 构造测试数据,实际使用时替换为pd.read_excel(file)即可
data = {
    'FinancialStatement1': ['REVENUES', 'Revenue1', 'Revenue2', 'EXPENSES', 'Expense1', 'Expense2', 'Expense3', 'PROFIT', '-'],
    'FinancialStatement2': ['REVENUES', 'Revenue1', 'Revenue2', 'EXPENSES', 'Expense1', 'PROFIT', '-', '-', '-'],
    'FinancialStatement3': ['REVENUES', 'Revenue1', 'Revenue2', 'Revenue3', 'EXPENSES', 'Expense1', 'Expense2', 'PROFIT', '-']
}
df = pd.DataFrame(data)

# 1. 把占位符'-'替换为NaN方便过滤
df = df.replace('-', np.nan)

# 2. 定义分组边界,也可以手动指定顺序比如group_headers = ['REVENUES', 'EXPENSES', 'PROFIT'],适配性更强
all_entries = pd.concat([df[col] for col in df.columns]).dropna().unique()
group_headers = [item for item in all_entries if item.isupper()]
# 按条目在表格中出现的先后顺序排序边界
group_headers.sort(key=lambda x: min(df[df.isin([x])].stack().index.get_level_values(0)))

# 3. 按区间提取最长条目列表
consolidated = []
for i in range(len(group_headers)):
    start_header = group_headers[i]
    end_header = group_headers[i+1] if i < len(group_headers)-1 else None
    # 遍历每一列提取当前区间的有效条目
    interval_lists = []
    for col in df.columns:
        col_entries = df[col].dropna().tolist()
        try:
            start_idx = col_entries.index(start_header)
            if end_header:
                end_idx = col_entries.index(end_header)
                interval = col_entries[start_idx:end_idx]
            else:
                interval = col_entries[start_idx:]
            interval_lists.append(interval)
        except ValueError:
            # 列不存在当前边界则跳过
            continue
    # 取最长的区间列表加入汇总
    max_interval = max(interval_lists, key=len)
    consolidated.extend(max_interval)

# 4. 汇总列长度和原df对齐,不足补空
df['Consolidated'] = consolidated + [np.nan]*(len(df)-len(consolidated))

# 输出结果时把NaN换回'-'方便查看
print(df.replace(np.nan, '-'))

运行结果

输出完全匹配预期:

序号FinancialStatement1FinancialStatement2FinancialStatement3Consolidated
0REVENUESREVENUESREVENUESREVENUES
1Revenue1Revenue1Revenue1Revenue1
2Revenue2Revenue2Revenue2Revenue2
3EXPENSESEXPENSESRevenue3Revenue3
4Expense1Expense1EXPENSESEXPENSES
5Expense2PROFITExpense1Expense1
6Expense3-Expense2Expense2
7PROFIT-PROFITExpense3
8---PROFIT

注意事项

如果你的分组标题不满足全大写规则,可以直接手动指定group_headers的列表顺序,避免自动识别出错。


内容的提问来源于stack exchange,提问作者bramble_shrambles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:36:05