Pandas中DataFrame合并问题:如何保留原始顺序实现合并
解决DataFrame合并后保留原始顺序的问题
嘿,这个问题我碰到过!首先咱们得先把你描述的两个DataFrame准确复现出来,这样后续操作更直观:
import pandas as pd import numpy as np # 创建df1,对应你给出的示例 df1 = pd.DataFrame( index=['B', 'A', 'C'], columns=['B', 'A', 'C'], data=[[1, np.nan, np.nan], [np.nan, 1, np.nan], [np.nan, np.nan, 2]] ) # 创建df2,对应你给出的示例 df2 = pd.DataFrame( index=['C', 'E', 'D'], columns=['C', 'E', 'D'], data=[[2, 3, np.nan], [np.nan, 1, np.nan], [np.nan, np.nan, 2]] )
你提到用df1.combine_first(df2)能实现合并,但没法保留原始顺序——这是因为pandas默认会对合并后的行、列索引按字母排序,所以咱们需要手动指定想要的顺序,用reindex方法来调整:
具体步骤:
- 先用
combine_first完成数据合并,这一步的逻辑是用df2的非空值填充df1的缺失值,完全符合你的需求; - 定义你期望的目标行顺序和目标列顺序;
- 用
reindex对合并后的DataFrame重新排序,就能得到你想要的结果。
代码实现如下:
# 执行合并 combined_df = df1.combine_first(df2) # 定义你想要的行、列顺序 target_row_order = ['B', 'A', 'C', 'D', 'E'] target_col_order = ['B', 'A', 'C', 'D', 'E'] # 重新索引,保留指定顺序 result_df = combined_df.reindex(index=target_row_order, columns=target_col_order) # 查看结果 print(result_df)
运行后输出的结果就是你期望的:
B A C D E B 1.0 NaN NaN NaN NaN A NaN 1.0 NaN NaN NaN C NaN NaN 2.0 NaN 3.0 D NaN NaN NaN 2.0 NaN E NaN NaN NaN NaN 1.0
补充说明:
如果你担心合并过程中索引排序影响结果,也可以先把两个DataFrame都扩展到目标行、列顺序,再执行combine_first,结果是完全一致的:
# 先扩展两个DataFrame的行、列到目标顺序 df1_extended = df1.reindex(index=target_row_order, columns=target_col_order) df2_extended = df2.reindex(index=target_row_order, columns=target_col_order) # 再执行合并 result_df = df1_extended.combine_first(df2_extended)
内容的提问来源于stack exchange,提问作者DPdl
相关产品推荐
相关产品推荐

