如何在Pandas中提取两单元格间条目最多列的区间内容合并财务报表
财务报表条目合并Pandas实现方案
问题说明
你当前遇到两个核心问题:
- 链式索引触发
SettingWithCopyWarning警告:你使用df['Consolidated'].iloc[1]属于链式索引操作,Pandas无法确认修改的是原DataFrame还是视图副本,因此抛出警告。 - 区间匹配逻辑未实现:需要按分组标题拆分区间,取各列对应区间最长的条目列表拼接得到汇总列。
实现代码
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, '-'))
运行结果
输出完全匹配预期:
| 序号 | FinancialStatement1 | FinancialStatement2 | FinancialStatement3 | Consolidated |
|---|---|---|---|---|
| 0 | REVENUES | REVENUES | REVENUES | REVENUES |
| 1 | Revenue1 | Revenue1 | Revenue1 | Revenue1 |
| 2 | Revenue2 | Revenue2 | Revenue2 | Revenue2 |
| 3 | EXPENSES | EXPENSES | Revenue3 | Revenue3 |
| 4 | Expense1 | Expense1 | EXPENSES | EXPENSES |
| 5 | Expense2 | PROFIT | Expense1 | Expense1 |
| 6 | Expense3 | - | Expense2 | Expense2 |
| 7 | PROFIT | - | PROFIT | Expense3 |
| 8 | - | - | - | PROFIT |
注意事项
如果你的分组标题不满足全大写规则,可以直接手动指定group_headers的列表顺序,避免自动识别出错。
内容的提问来源于stack exchange,提问作者bramble_shrambles
相关产品推荐
相关产品推荐

