合并两个具有重叠 MultiIndex 列的 DataFrame

Posted

技术标签:

【中文标题】合并两个具有重叠 MultiIndex 列的 DataFrame【英文标题】:Merge two DataFrames with overlapping MultiIndex columns 【发布时间】:2021-05-29 19:09:58 【问题描述】:

我正在尝试找到一种简单的方法将两个 MultiIndex 数据框合并在一起,以添加新列并合并现有列。例如,如果我有两个数据框

d1_columns = pd.MultiIndex.from_product([["A", "B",], ["1", "2"]])
d1_index = pd.date_range("2020-01-01", "2020-01-5", freq="D")
d1 = pd.DataFrame(random.rand(5, 4), columns=d1_columns, index=d1_index)

print(d1)


                 A                   B          
                   1         2         1         2
2020-01-01  0.381909  0.487480  0.389250  0.853449
2020-01-02  0.752374  0.508806  0.491892  0.786918
2020-01-03  0.019655  0.537763  0.263242  0.378302
2020-01-04  0.460276  0.227113  0.423472  0.514639
2020-01-05  0.046673  0.864282  0.223340  0.929049

d2_columns = pd.MultiIndex.from_product([["B", "C"], ["1", "2"]])
d2_index = pd.date_range("2020-01-03", "2020-01-7", freq="D")
d2 = pd.DataFrame(random.rand(5, 4), columns=d2_columns, index=d2_index)

print(d2)

                   B                   C          
                   1         2         1         2
2020-01-03  0.495979  0.888207  0.776861  0.531693
2020-01-04  0.408030  0.545351  0.452913  0.768284
2020-01-05  0.374996  0.593571  0.925979  0.398629
2020-01-06  0.085565  0.845354  0.792325  0.501057
2020-01-07  0.780985  0.390948  0.731769  0.488155

如果我想合并它们,我会将重叠的列分开,而新列可以正常工作:

df = d1.merge(d2, left_index=True, right_index=True, how="outer")

print(df)

                   A                 B_x                 B_y            \
                   1         2         1         2         1         2   
2020-01-01  0.381909  0.487480  0.389250  0.853449       NaN       NaN   
2020-01-02  0.752374  0.508806  0.491892  0.786918       NaN       NaN   
2020-01-03  0.019655  0.537763  0.263242  0.378302  0.495979  0.888207   
2020-01-04  0.460276  0.227113  0.423472  0.514639  0.408030  0.545351   
2020-01-05  0.046673  0.864282  0.223340  0.929049  0.374996  0.593571   
2020-01-06       NaN       NaN       NaN       NaN  0.085565  0.845354   
2020-01-07       NaN       NaN       NaN       NaN  0.780985  0.390948   

                   C            
                   1         2  
2020-01-01       NaN       NaN  
2020-01-02       NaN       NaN  
2020-01-03  0.776861  0.531693  
2020-01-04  0.452913  0.768284  
2020-01-05  0.925979  0.398629  
2020-01-06  0.792325  0.501057  
2020-01-07  0.731769  0.488155 

有没有一种简单的方法可以合并重叠的列,以便将新数据添加到现有列中(是否覆盖以前的数据无关紧要),所以输出看起来像这样?

                   A                 B                     C          
                   1         2         1         2         1         2
2020-01-01  0.633182  0.335651  0.072520  0.578472       NaN       NaN
2020-01-02  0.785482  0.562421  0.658556  0.557171       NaN       NaN
2020-01-03  0.755049  0.575611  0.592934  0.735094  0.647117  0.306296
2020-01-04  0.035943  0.792211  0.002617  0.159366  0.320691  0.825184
2020-01-05  0.932623  0.643129  0.778002  0.581527  0.718405  0.289289
2020-01-06       NaN       NaN  0.085565  0.845354  0.012412  0.960234
2020-01-07       NaN       NaN  0.780985  0.390948  0.444406  0.210821

谢谢

【问题讨论】:

【参考方案1】:

看来你想要

df = d1.combine_first(d2)

df = d2.combine_first(d1)

取决于应首选哪个帧的值。

【讨论】:

以上是关于合并两个具有重叠 MultiIndex 列的 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

为啥在具有一级索引的 MultiIndex 列的 pandas DataFrame 中表现不同?

合并两个 pandas.core.indexes.multi.MultiIndex

如何使用 MultiIndex 合并两个数据框?

在 Pandas 中将两个 MultiIndex 级别合并为一个

将具有两个日期列的一个数据框与另一个具有两个日期列的数据框合并

合并具有几个不同列的两个数据框