pandas - 一个切片上的 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 中,所有级别的不同值的数量很大,所以我不想明确引用这些,当然,除了我想要分配的标签“红色”。
解决方案
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
推荐阅读
- mysql - 在mysql中的不同选择上选择最大时间戳值
- python - Django NameError: name 'Instractor' is not defined
- mysql - 我如何才能找到每年目前在职的每种性别的员工总数?
- node.js - 用于 redis 会话功能的玩笑模拟
- firebase - 数组内不允许使用 Firebase Firestore 时间戳
- ios - 缺少“通用 iOS 设备”
- python - Azure Function 在本地运行,但在 Docker 容器构建并在本地运行后不执行任何操作
- angular - Web3 合约方法调用在 Angular 中引发错误
- cassandra - 从 Datastax 6.0 到 Cassandra 3 的迁移路径
- angular - Angular 11-对象可能是“空”