基于子串(名称+起始日期)合并DataFrame列并保留原列名
处理Pandas列名按「名称+起始日期」合并求和的问题
现有一个Pandas DataFrame,列名格式为「名称/startDateTime/endDateTime」,示例代码如下:
import pandas as pd df = pd.DataFrame({ "[RATE] BOJ presser/2024-03-19T07:30:00Z/2024-03-19T10:30:00Z": [1], "[RATE] BOJ/2024-01-23T04:00:00Z/2024-01-23T07:00:00Z": [2], "[RATE] BOJ/2024-03-19T04:00:00Z/2024-03-19T07:00:00Z": [3], "[RATE] BOJ/2024-04-26T03:00:00Z/2024-04-26T06:00:00Z": [4], "[RATE] BOJ/2024-04-26T03:00:00Z/2024-04-26T08:00:00Z": [5], "[RATE] BOJ/2024-06-14T03:00:00Z/2024-06-14T06:00:00Z": [6], "[RATE] BOJ/2024-06-14T03:00:00Z/2024-06-14T08:00:00Z": [7], "[RATE] BOJ/2024-07-31T03:00:00Z/2024-07-31T06:00:00Z": [8], "[RATE] BOJ/2024-07-31T03:00:00Z/2024-07-31T08:00:00Z": [9], "[RATE] BOJ/2024-09-20T03:00:00Z/2024-09-20T06:00:00Z": [10], "[RATE] BOJ/2024-09-20T03:00:00Z/2024-09-20T08:00:00Z": [11], "[RATE] BOJ/2024-10-31T04:00:00Z/2024-10-31T07:00:00Z": [12], "[RATE] BOJ/2024-10-31T04:00:00Z/2024-10-31T09:00:00Z": [13], "[RATE] BOJ/2024-12-19T04:00:00Z/2024-12-19T07:00:00Z": [14], "[RATE] BOJ/2024-12-19T04:00:00Z/2024-12-19T09:00:00Z": [15], })
需求
将具有相同名称和**起始日期(仅日期部分,不含时间)**的列合并,对列内所有行的值求和,保留该组中第一个出现的原列名。预期结果示例:
pd.DataFrame({ "[RATE] BOJ presser/2024-03-19T07:30:00Z/2024-03-19T10:30:00Z": [1], "[RATE] BOJ/2024-01-23T04:00:00Z/2024-01-23T07:00:00Z": [2], "[RATE] BOJ/2024-03-19T04:00:00Z/2024-03-19T07:00:00Z": [3], "[RATE] BOJ/2024-04-26T03:00:00Z/2024-04-26T06:00:00Z": [9], "[RATE] BOJ/2024-06-14T03:00:00Z/2024-06-14T06:00:00Z": [13], "[RATE] BOJ/2024-07-31T03:00:00Z/2024-07-31T06:00:00Z": [17], "[RATE] BOJ/2024-09-20T03:00:00Z/2024-09-20T06:00:00Z": [21], "[RATE] BOJ/2024-10-31T04:00:00Z/2024-10-31T07:00:00Z": [25], "[RATE] BOJ/2024-12-19T04:00:00Z/2024-12-19T07:00:00Z": [29], })
注:示例为单行数据,实际数据为带DatetimeIndex的多行数据。
解决方案
# 1. 解析列名,生成分组键和第一个列名映射 group_keys = [] first_col_map = {} for col in df.columns: # 拆分列名:名称、起始时间、结束时间 name, start_dt, end_dt = col.split('/') # 提取起始日期部分(去掉时间) start_date = start_dt.split('T')[0] # 分组键:名称+起始日期 key = (name, start_date) group_keys.append(key) # 记录每个分组的第一个列名 if key not in first_col_map: first_col_map[key] = col # 2. 按分组键对列求和 summed_df = df.T.groupby(group_keys).sum().T # 3. 将列名重命名为分组的第一个列名,并保持原列顺序 # 生成新列名列表:按原分组顺序取第一个列名 new_columns = [first_col_map[key] for key in summed_df.columns] summed_df.columns = new_columns # 查看结果 print(summed_df)
代码说明
- 第一步拆分列名,提取用于分组的「名称+起始日期」键,同时记录每个分组首次出现的列名,保证后续保留原列名。
- 第二步转置DataFrame后按分组键求和,再转置回来,实现列维度的分组求和。
- 第三步将求和后的列名替换为分组的第一个原列名,同时保持原有的列顺序。
内容的提问来源于stack exchange,提问作者Crovish
相关产品推荐
相关产品推荐

