如何用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
相关产品推荐
相关产品推荐

