首页 > 解决方案 > 一个切片上的 Pandas 多索引总和,将其他切片设置为零

问题描述

我有一个像这样的三暗系列

start_date = '2020-01-01'
end_date = '2020-03-01'
date_range = pd.date_range(start_date, end_date, freq='MS')
axis_1, axis_2 = ['A','B'], ['red','blue']
iterables = [date_range, axis_1, axis_2 ]
index_names = ['time', 'level 1','level 2']
multi_index = pd.MultiIndex.from_product(iterables, names=index_names)
df = pd.Series(_data, index=multi_index)

看起来像这样:

level 0     level 1  level 2
2020-01-01  A        red        0.5
                     blue       0.5
            B        red        0.5
                     blue       0.5
2020-02-01  A        red        0.5
                     blue       0.5
            B        red        0.2
                     blue       0.2
2020-03-01  A        red        0.2
                     blue       0.2
            B        red        0.2
                     blue       0.2
dtype: float64

我想总结 [0,1] 级别,换句话说,每行的红色+蓝色。但是,我想将总和分配给red并设置blue为零。

像这样:

level 0     level 1  level 2
2020-01-01  A        red        1.0
                     blue       0.0
            B        red        1.0
                     blue       0.0
2020-02-01  A        red        1.0
                     blue       0.0
            B        red        0.4
                     blue       0.0
2020-03-01  A        red        0.4
                     blue       0.0
            B        red        0.4
                     blue       0.0
dtype: float64

非常感谢您的帮助。

在我的实际 DF 中,所有级别的不同值的数量很大,所以我不想明确引用这些,当然,除了我想要分配的标签“红色”。

标签: pandas

解决方案


IIUC,你可以尝试这样的事情:

df_sum = df.sum(level=[0,1]).to_frame()
df_sum['level 2'] = 'red'
df_sum.set_index('level 2', append=True).reindex(df.index, fill_value=0)[0]

输出:

time        level 1  level 2
2020-01-01  A        red        1.0
                     blue       0.0
            B        red        1.0
                     blue       0.0
2020-02-01  A        red        1.0
                     blue       0.0
            B        red        0.4
                     blue       0.0
2020-03-01  A        red        0.4
                     blue       0.0
            B        red        0.4
                     blue       0.0
Name: 0, dtype: float64

推荐阅读