python - 带有多索引数据框的 Pandas pct_change
问题描述
我想计算多指数 pandas df 的百分比变化。
df = pd.DataFrame(
index = pd.MultiIndex.from_product([['2020-05-01', '2020-06-01'],
['Device 1'],
['Sub Device 1', 'Sub Device 2', 'Sub Device 3'],
['New User', 'Returning User']],
names=['Month', 'Device', 'Sub Device', 'New User Ind']),
data={'Users':[1011598, 1654645, 40917, 190305, 31284,
61318, 1040834, 1577128, 29896, 156499,
29133, 59622]})
我正在寻找四个索引级别的每个组合的 pct_change。这就是我现在所拥有的:
df.groupby(level=[0,1,2,3]).pct_change()
但我得到的只是用户列中的空值。
我还需要在apply
后面加上一个groupby
吗?
决赛桌应该是这样的
Users
Month Device Sub Device New User Ind
2020-05-01 Device 1 Sub Device 1 New User NaN
Returning User NaN
Sub Device 2 New User NaN
Returning User NaN
Sub Device 3 New User NaN
Returning User NaN
2020-06-01 Device 1 Sub Device 1 New User 0.02
Returning User -0.04
Sub Device 2 New User -0.20
Returning User -0.17
Sub Device 3 New User -0.06
Returning User -0.02
解决方案
使用 groupby,你很接近,只是不需要包含索引的 0 级:
df.groupby(level=[1,2,3]).pct_change()
输出:
Users
Month Device Sub Device New User Ind
2020-05-01 Device 1 Sub Device 1 New User NaN
Returning User NaN
Sub Device 2 New User NaN
Returning User NaN
Sub Device 3 New User NaN
Returning User NaN
2020-06-01 Device 1 Sub Device 1 New User 0.028901
Returning User -0.046848
Sub Device 2 New User -0.269350
Returning User -0.177641
Sub Device 3 New User -0.068757
Returning User -0.027659
推荐阅读
- c++ - std::fmod 糟糕的双精度
- azure-devops - Azure AD Graph 与 MS Graph Application.ReadWrite.All
- sql - SQL - 为给定列提取最新的 1 条记录
- angular5 - 导入到Angular5中的延迟加载模块
- discord - 如何使用 discord.py 在不和谐服务器的特定频道中获取所有聊天消息?
- django - DRF 中奇怪的 API 响应 - 在服务器运行时工作,在重新加载时清空
- python - 为什么使用 tkinter 文本时光标粗细会发生变化?
- biztalk - BizTalk 架构中的 xs:string 字段元素更改为 Uint16
- c - 如何利用未使用的位来节省内存?
- sql - 动态日期报告