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

基于子串(名称+起始日期)合并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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:32:32