如何添加具有不同列轴级别数但共享相同轴名称的 dfs?

问题描述 投票:0回答:1

我有两个多级列数据框:

data = {
    'A': {
        'X': {'Value1': 2, 'Value2': 1},
        'Y': {'Value1': 2, 'Value2': 3}
    },
    'B': {
        'X': {'Value1': 10, 'Value2': 11},
        'Y': {'Value1': 10, 'Value2': 11}
    }
}

df = pd.DataFrame(data)

看起来像这样...

Group          A                           B                                   
Subgroup        X            Y             X             Y                        
Metric         Value1 Value2 Value1 Value2 Value1 Value2 Value1 Value2
2023-01-01        2     1     2     3     10     11     10     11
2023-01-02        2     1     2     3     10     11     10     11
2023-01-03        2     1     2     3     10     11     10     11
2023-01-04        2     1     2     3     10     11     10     11
2023-01-05        2     1     2     3     10     11     10     11
df2:

data = {
    'A': {'Value1': [3, 3, 1, 3, 3], 'Value2': [5, 2, 2, 2, 2]},
    'B': {'Value1': [3, 4, 7, 3, 3], 'Value2': [2, 2, 7, 2, 2]}
}

df_2 = pd.DataFrame(data, index=pd.to_datetime(['2023-01-01', 
'2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05']))

# Convert to constructor
df2 = df_2.unstack().unstack()

看起来像这样...

Group          A             B                                                 
Metric         Value1 Value2 Value1 Value2 
2023-01-01        3      5     3     2    
2023-01-02        3      2     4     2      
2023-01-03        1      2     7     7    
2023-01-04        3      2     3     2       
2023-01-05        3      2     3     2      

并且想要将 df2 添加到 df1,但对于组和指标的每个组合,在每个匹配的子组中添加,如下所示...

Group          A                           B                                   
Subgroup        X            Y             X             Y                        
Metric         Value1 Value2 Value1 Value2 Value1 Value2 Value1 Value2
2023-01-01        5     6     5     5     13     13     13     13
2023-01-02        5     3     6     5     14     15     14     13
2023-01-03        3     3     9     10    17     18     17     18
2023-01-04        5     3     5     5     13     14     13     13
2023-01-05        5     3     5     5     13     14     13     13

如有任何帮助,我们将不胜感激。

一些想法,例如合并,但我认为我失去了上面的中间子组级别,但可能做得不正确。

python pandas dataframe multi-level
1个回答
0
投票

我认为最简单的可能是在 df1 上

droplevel
,然后
add
,最后重新创建 DataFrame:

pd.DataFrame(df1.droplevel('Subgroup', axis=1).add(df2).to_numpy(),
             index=df1.index, columns=df1.columns)

输出:

Group           A                           B                     
Subgroup        X             Y             X             Y       
Metric     Value1 Value2 Value1 Value2 Value1 Value2 Value1 Value2
2023-01-01      5      5      6      8     13     13     13     13
2023-01-02      5      5      3      5     14     14     13     13
2023-01-03      3      3      3      5     17     17     18     18
2023-01-04      5      5      3      5     13     13     13     13
2023-01-05      5      5      3      5     13     13     13     13
© www.soinside.com 2019 - 2024. All rights reserved.