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

如何用Pandas合并3个同类小时spread表并修改列名?

合并多小时spread表格并修改列名方案

需求:有3个结构相似的表格,每个记录24小时的spread数值,需要合并为一个包含4列(含hour列)、25行(含表头)的表格用于对比,同时要修改3个spread列的标题。

步骤1:模拟生成3个结构一致的数据源

基于你提供的代码,我们先创建3个同结构的DataFrame:

import pandas as pd

# 小时列表(保留原数据缺失05的情况,如需补全可看文末补充)
hour = ['00', '01', '02', '03', '04', '06', '07', '08', '09', '10',
        '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21',
        '22', '23']

# 模拟3组不同的spread数据
spread1 = [27.461988, 2.144416, 0.970719, 0.883571, 1.234078, 0.747148,
           0.660058, 1.025625, 0.660939, 0.600193, 0.412775, 0.503613, 0.468141,
           0.417250, 0.366429, 0.414767, 0.295326, 0.289255, 0.091598, 0.312621,
           0.393910, 0.490924, 0.425078, 1.350392]
spread2 = [26.5, 2.2, 1.0, 0.9, 1.3, 0.8, 0.7, 1.1, 0.7, 0.6, 0.4, 0.5, 0.5,
           0.4, 0.4, 0.4, 0.3, 0.3, 0.1, 0.3, 0.4, 0.5, 0.4, 1.4]
spread3 = [28.0, 2.0, 0.9, 0.8, 1.2, 0.7, 0.6, 1.0, 0.6, 0.5, 0.4, 0.5, 0.4,
           0.4, 0.3, 0.4, 0.3, 0.2, 0.1, 0.3, 0.4, 0.5, 0.4, 1.3]

# 创建3个独立DataFrame
df1 = pd.DataFrame(list(zip(hour, spread1)), columns=['hour', 'spread'])
df2 = pd.DataFrame(list(zip(hour, spread2)), columns=['hour', 'spread'])
df3 = pd.DataFrame(list(zip(hour, spread3)), columns=['hour', 'spread'])

步骤2:横向合并表格

以hour为匹配键,用pd.concat横向合并三个表格:

# 将每个表格的hour设为索引,避免合并后重复出现hour列
df1.set_index('hour', inplace=True)
df2.set_index('hour', inplace=True)
df3.set_index('hour', inplace=True)

# 横向合并(axis=1表示按列合并)
merged_df = pd.concat([df1, df2, df3], axis=1)

步骤3:修改spread列标题

有两种直接的修改方式:

方法1:批量修改所有列名

直接给合并后的表格赋值新列名,适合一次性定义所有标题:

# 自定义列名,比如按日期区分
merged_df.columns = ['spread_周一', 'spread_周二', 'spread_周三']

方法2:单个修改列名(适合调整部分列)

如果只需要修改某几列,用rename方法:

# 注意:合并后初始列名都是spread,rename会批量修改同名列,所以更适合先给单个df改名再合并
df1.rename(columns={'spread': 'spread_周一'}, inplace=True)
df2.rename(columns={'spread': 'spread_周二'}, inplace=True)
df3.rename(columns={'spread': 'spread_周三'}, inplace=True)
# 再执行合并操作
merged_df = pd.concat([df1, df2, df3], axis=1)

步骤4:还原hour为普通列(可选)

如果需要把hour从索引变回普通列,执行重置索引:

merged_df.reset_index(inplace=True)

补充:补全缺失的05小时数据

如果需要让表格包含完整的00-23小时,先生成完整小时列表再补全:

# 生成00到23的完整小时列表
full_hour = [f"{h:02d}" for h in range(24)]
# 重新创建df并补全缺失数据
df1 = pd.DataFrame(list(zip(hour, spread1)), columns=['hour', 'spread']).set_index('hour')
df1 = df1.reindex(full_hour)  # 补全缺失的05小时,对应值为NaN,可按需填充
# 对df2、df3执行同样操作后再合并

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:15:41