如何将多个DataFrame的数据填充至新的空DataFrame?
问题描述
我有两个包含不同数据的DataFrame:
#1 DataFrame
| Player A | Time | a | b | c | d |
|---|---|---|---|---|---|
| 1 | 1 | 5.83 | 10.21 | 3.12 | 2.33 |
| 1 | 2 | 5.64 | 10.16 | 3.15 | 2.37 |
| 1 | 3 | 5.60 | 10.11 | 3.19 | 2.42 |
| 1 | 4 | 5.55 | 10.08 | 3.22 | 2.46 |
| 1 | 5 | 5.52 | 10.02 | 3.27 | 2.50 |
| 1 | 6 | 5.48 | 9.97 | 3.33 | 2.55 |
#2 DataFrame
| Player B | Time | e | f | g | h |
|---|---|---|---|---|---|
| 1 | 1 | 7.77 | 9.63 | 5.61 | 4.33 |
| 1 | 2 | 7.79 | 9.66 | 5.66 | 4.37 |
| 1 | 5 | 7.83 | 9.72 | 5.72 | 4.42 |
| 1 | 6 | 7.96 | 9.77 | 5.77 | 4.56 |
| 1 | 7 | 9.22 | 9.83 | 6.23 | 4.67 |
| 1 | 9 | 9.41 | 9.97 | 6.54 | 5.55 |
我需要合并这两个DataFrame,得到如下预期输出:
| Index | Player A | Player B | Time | a | b | c | d | e | f | g | h |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 1 | 1 | 5.83 | 10.21 | 3.12 | 2.33 | 7.77 | 9.63 | 5.61 | 4.33 |
| 1 | 1 | 1 | 2 | 5.64 | 10.16 | 3.15 | 2.37 | 7.79 | 9.66 | 5.66 | 4.37 |
| 2 | 1 | nan | 3 | 5.60 | 10.11 | 3.19 | 2.42 | nan | nan | nan | nan |
| 3 | 1 | nan | 4 | 5.55 | 10.08 | 3.22 | 2.46 | nan | nan | nan | nan |
| 4 | 1 | 1 | 5 | 5.52 | 10.02 | 3.27 | 2.50 | 7.83 | 9.72 | 5.72 | 4.42 |
| 5 | 1 | 1 | 6 | 5.48 | 9.97 | 3.33 | 2.55 | 7.96 | 9.77 | 5.77 | 4.56 |
| 6 | nan | 1 | 7 | nan | nan | nan | nan | 9.22 | 9.83 | 6.23 | 4.67 |
| 7 | nan | nan | 8 | nan | nan | nan | nan | nan | nan | nan | nan |
| 8 | nan | 1 | 9 | nan | nan | nan | nan | 9.41 | 9.97 | 6.54 | 5.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
相关产品推荐
相关产品推荐

