【问题标题】:Pandas pct_change with Multi-Index DataFrame带有多索引数据框的 Pandas pct_change
【发布时间】:2020-11-10 05:20:49
【问题描述】:

我想计算多指数 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()

但我得到的只是用户列中的空值。

我还需要在groupby 之后添加apply 吗?

决赛桌应该是这样的

                                                 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

【问题讨论】:

    标签: python pandas dataframe pandas-groupby multi-index


    【解决方案1】:

    使用 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
    

    【讨论】:

    • @Scott_Boston 感谢您的回复。虽然 stack/unstack 方法确实有效,但是否可以直接将 .pct_change() 方法与类似于 .sum() 或 .diff() 的 groupby 一起使用?
    • @Scott_Boston 谢谢!在这种情况下,为什么我不在 groupby 中包含第一级?
    • @JamesD。因为无论日期如何,您都在获取差异,所以您不希望每个日期都在自己的组中。您想按其他索引级别进行分组,并获取不同日期的差异。
    猜你喜欢
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2020-10-22
    • 2020-04-11
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    相关资源
    最近更新 更多