如何用pandas将dataframe表头合约分组后按日计算各组成交量总和
实现方案
核心思路是将分组规则和业务代码分离,分组配置放在独立的外部文件维护,不需要修改代码即可更新规则,具体实现步骤如下:
1. 整理外部分组配置文件
你已经用Excel整理了分组规则,直接将其导出为contract_groups.csv即可,配置表只需要保留2列:
- 第一列:分组名称(比如「近月持仓量」「远月持仓量」)
- 第二列:对应合约名称(和你的DataFrame列名完全一致,大小写、空格、字符都不能有差异)
配置表示例:
分组名称,合约名称 近月持仓量,March 2022 Contract 近月持仓量,Sep 2021 Contract 近月持仓量,Dec Contract 2021 远月持仓量,June 2021 Contract 远月持仓量,March 2021 Contract 全部合约总成交量,March 2022 Contract 全部合约总成交量,Sep 2021 Contract ...
后续调整分组规则时,直接修改这个CSV文件即可,比如新增分组、给分组增删合约都不需要动代码。
2. 代码读取配置并自动计算分组总和
示例代码如下(基于Python Pandas实现):
import pandas as pd # 1. 读取分组配置,转换为「分组名: 对应合约列表」的字典 group_config = pd.read_csv("contract_groups.csv") group_map = group_config.groupby("分组名称")["合约名称"].apply(list).to_dict() # 2. 读取每日成交量数据源 daily_data = pd.read_csv("你的每日成交量数据.csv", parse_dates=["日期"], index_col="日期") # 3. 批量计算所有分组的每日成交量总和 group_result = pd.DataFrame() for group_name, contract_list in group_map.items(): # 可选校验:提示配置中不存在的合约,方便排查错误 invalid_contracts = [c for c in contract_list if c not in daily_data.columns] if invalid_contracts: print(f"分组【{group_name}】存在未匹配的合约:{invalid_contracts}") # 计算分组总和 group_result[group_name] = daily_data[contract_list].sum(axis=1) # 输出结果,可直接保存为csv或者后续分析使用 print(group_result)
方案优势
- 配置独立维护,每季度调整分组规则时,仅需要修改配置文件即可,完全不需要触碰业务代码
- 支持任意数量的分组,单个分组的合约数量没有上限,哪怕超过90个也可以正常运行
- 自带校验逻辑,避免配置写错合约名导致计算错误的问题
内容的提问来源于stack exchange,提问作者greenfan320
相关产品推荐
相关产品推荐

