如何将多个DataFrame合并为一个:以time为索引、id为列名
解决方案:将多个固定时间的DataFrame转换为宽格式表格
我明白你的需求啦——你手上有一批结构相似的DataFrame,每个里面的time值都是固定的,而且所有DF的id列包含完全相同的元素,现在要把它们整合成一个新的宽表:每个原DF对应新表的一行,用那个唯一的time当行索引,id里的元素作为新表的列名,对应位置填原DF里的数值。
咱们先从示例数据入手,这样更直观:
import pandas as pd # 模拟你手上的DataFrame列表 df_list = [ pd.DataFrame({'time': ['2023-01-01']*3, 'id': ['A', 'B', 'C'], 'value': [10, 20, 30]}), pd.DataFrame({'time': ['2023-01-02']*3, 'id': ['A', 'B', 'C'], 'value': [15, 25, 35]}), pd.DataFrame({'time': ['2023-01-03']*3, 'id': ['A', 'B', 'C'], 'value': [12, 22, 32]}) ]
接下来是核心的处理步骤,思路很简单:把每个小DF先转成单行的宽格式,再把所有单行DF拼起来就行:
# 处理每个DataFrame,转成以time为索引的单行宽表 processed_dfs = [] for df in df_list: # 取出当前DF唯一的time值 current_time = df['time'].iloc[0] # 将id设为索引,提取数值列后转置成单行,再把time设为行索引 wide_single_row = df.set_index('id')['value'].to_frame().T wide_single_row.index = [current_time] processed_dfs.append(wide_single_row) # 合并所有处理后的单行表 final_df = pd.concat(processed_dfs)
运行之后你会得到这样的结果:
A B C 2023-01-01 10 20 30 2023-01-02 15 25 35 2023-01-03 12 22 32
如果想让代码更简洁,用列表推导式一步到位:
final_df = pd.concat( [df.set_index('id')['value'].to_frame().T.set_index([df['time'].iloc[0]]) for df in df_list] )
⚠️ 注意:如果你的原DataFrame里存储数值的列不是叫value,记得把代码里的['value']替换成你实际的列名(比如['score']、['metric']之类的)。
内容的提问来源于stack exchange,提问作者Rory Devitt
相关产品推荐
相关产品推荐

