如何将多个DataFrame按月/日格式日期对齐汇总为目标宽表?
正确实现方案
核心逻辑
你之前方案失效的核心原因是没有给不同赛季的数值列设置唯一列名,也没有基于date字段做对齐关联,具体实现步骤如下:
实现步骤
第一步:预处理每个赛季的DataFrame
首先对列表内的每个DataFrame做格式转换、列重命名和索引设置,避免列名冲突,同时为后续对齐做准备:
import pandas as pd # 按list_1存储顺序定义对应赛季名称 seasons = ['16/17', '17/18', '18/19', '19/20'] processed_dfs = [] for df, season_name in zip(list_1, seasons): # 转换日期为月/日格式 df['date'] = pd.to_datetime(df['date']).dt.strftime('%m/%d') # 重命名数值列为当前赛季名(示例中数值列原名为value,可替换为你实际的列名) df = df.rename(columns={'value': season_name}) # 将date设为索引,用于后续对齐 df = df.set_index('date') processed_dfs.append(df)
补充:如果每个DataFrame包含多个数值字段,可以批量给列名加赛季前缀避免冲突,替换上述重命名逻辑即可:
# 批量给所有列加赛季前缀 df = df.add_prefix(f'{season_name}_') # 把date列的前缀去掉,保证所有df的索引列名统一 df = df.rename(columns={f'{season_name}_date': 'date'})
第二步:横向合并得到宽表
按date索引对齐合并所有处理后的DataFrame,缺失值自动填充为NaN:
result_df = pd.concat(processed_dfs, axis=1) # 如果需要把date从索引转为普通列,添加下面这行代码 # result_df = result_df.reset_index()
原方案失效原因
pd.concat(list_1,axis=1):按DataFrame的默认行索引对齐,不是按date字段的取值对齐,无法实现日期匹配- 先纵向concat再groupby的方案:所有赛季的数值列列名重复,纵向合并后所有赛季的数值都存在同一列中,groupby后仅能保留每个日期第一个出现的赛季数值,无法生成多赛季并列的宽表
内容的提问来源于stack exchange,提问作者kobo
相关产品推荐
相关产品推荐

