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

如何将多个DataFrame的数据填充至新的空DataFrame?

问题描述

我有两个包含不同数据的DataFrame:

#1 DataFrame

Player ATimeabcd
115.8310.213.122.33
125.6410.163.152.37
135.6010.113.192.42
145.5510.083.222.46
155.5210.023.272.50
165.489.973.332.55

#2 DataFrame

Player BTimeefgh
117.779.635.614.33
127.799.665.664.37
157.839.725.724.42
167.969.775.774.56
179.229.836.234.67
199.419.976.545.55

我需要合并这两个DataFrame,得到如下预期输出:

IndexPlayer APlayer BTimeabcdefgh
01115.8310.213.122.337.779.635.614.33
11125.6410.163.152.377.799.665.664.37
21nan35.6010.113.192.42nannannannan
31nan45.5510.083.222.46nannannannan
41155.5210.023.272.507.839.725.724.42
51165.489.973.332.557.969.775.774.56
6nan17nannannannan9.229.836.234.67
7nannan8nannannannannannannannan
8nan19nannannannan9.419.976.545.55

我已经创建了一个空DataFrame,但所有值都是NaN,不知道后续怎么处理:

df = pd.DataFrame(columns=['Player A', 'Player B', 'Time','C','D','E','F','G','H'], index=range(10))

注:使用Python 3.9版本。


解决方案

不需要手动创建空DataFrame再填充,直接用Pandas的merge结合序列对齐就能实现需求,步骤如下:

1. 合并两个原始DataFrame

以Time为键做外连接,保留两个DataFrame中所有出现过的Time值:

merged_df = pd.merge(df1, df2, on='Time', how='outer')

2. 生成完整的Time序列

预期输出包含Time从1到9的所有值,先生成这个完整序列:

full_time = pd.DataFrame({'Time': range(1, 10)})

3. 对齐到完整Time序列

将合并后的DataFrame与完整Time序列做左连接,确保每个Time值都存在:

final_df = pd.merge(full_time, merged_df, on='Time', how='left')

4. 调整列顺序与索引

按照预期输出的列顺序整理,同时重置索引并添加Index列:

final_df = final_df[['Player A', 'Player B', 'Time', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']]
final_df = final_df.reset_index(drop=False).rename(columns={'index': 'Index'})

完整代码示例

import pandas as pd

# 构造原始DataFrame
df1 = pd.DataFrame({
    'Player A': [1]*6,
    'Time': [1,2,3,4,5,6],
    'a': [5.83,5.64,5.60,5.55,5.52,5.48],
    'b': [10.21,10.16,10.11,10.08,10.02,9.97],
    'c': [3.12,3.15,3.19,3.22,3.27,3.33],
    'd': [2.33,2.37,2.42,2.46,2.50,2.55]
})

df2 = pd.DataFrame({
    'Player B': [1]*6,
    'Time': [1,2,5,6,7,9],
    'e': [7.77,7.79,7.83,7.96,9.22,9.41],
    'f': [9.63,9.66,9.72,9.77,9.83,9.97],
    'g': [5.61,5.66,5.72,5.77,6.23,6.54],
    'h': [4.33,4.37,4.42,4.56,4.67,5.55]
})

# 合并并生成完整序列
merged_df = pd.merge(df1, df2, on='Time', how='outer')
full_time = pd.DataFrame({'Time': range(1, 10)})
final_df = pd.merge(full_time, merged_df, on='Time', how='left')

# 调整列顺序和索引
final_df = final_df[['Player A', 'Player B', 'Time', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']]
final_df = final_df.reset_index(drop=False).rename(columns={'index': 'Index'})

print(final_df)

注意:你之前创建空DataFrame时列名写错了(用了大写的C、D等,应该和原始DataFrame的小写a、b、c等保持一致),上述代码已修正该问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:22:51