对一个切片进行多索引求和,将其他切片设置为零



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

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中,所有级别的不同值的数量很大,所以我不想显式地引用它们,当然,除了我想要分配给的标签'red'。

如果是这样,您可以尝试这样做:

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

这是一个使用pandasnumpy的解决方案,这可能是一个相反的。

import numpy as np
sum_val = df.groupby(['time', 'level 1']).sum().values
new_val = np.dstack((sum_val, np.zeros(len(a)))).flatten()
pd.Series(new_val, index=multi_index)

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
dtype: float64

最新更新