Python Pandas 条件一阶差分

Python Pandas Conditional First Differencing

我有一个 Pandas 数据框,看起来像这样:

                          Item1  Item2  Item3
Customer  date                                                           
1         2014-03-24       0.0   10.0   50.0   
          2014-06-23       0.0   20.0   60.0   
          2014-09-22       0.0   20.0   40.0   
          2014-12-22       3.0   30.0   20.0
          2014-12-29       0.0   30.0   20.0   
2         2014-03-24       0.0   10.0   50.0   
          2014-06-23       0.0   20.0   60.0   
          2014-09-22       0.0   20.0   40.0   
          2014-12-22       4.0   30.0   20.0
          2014-12-29       0.0   30.0   20.0    
3         2014-03-24       0.0   10.0   50.0   
          2014-06-23       0.0   20.0   60.0   
          2014-09-22       0.0   20.0   40.0   
          2014-12-22       5.0   30.0   20.0
          2014-12-29       0.0   30.0   20.0     

它根据客户编号和日期进行了多重索引。我想计算每个项目的第一个差异以达到客户,同时忽略数字从 0 到 0 的实例。输出如下所示:

                          Item1  Item2  Item3
Customer  date                                                           
1         2014-03-24       NaN   NaN    NaN   
          2014-06-23       NaN   10.0   10.0   
          2014-09-22       NaN    0.0   20.0   
          2014-12-22       3.0   10.0  -20.0
          2014-12-29      -3.0    0.0    0.0  
2         2014-03-24       NaN   NaN    NaN   
          2014-06-23       NaN   10.0   10.0   
          2014-09-22       NaN    0.0   20.0   
          2014-12-22       4.0   10.0  -20.0
          2014-12-29      -4.0    0.0    0.0  
3         2014-03-24       NaN   NaN    NaN   
          2014-06-23       NaN   10.0   10.0   
          2014-09-22       NaN    0.0   20.0   
          2014-12-22       5.0   10.0  -20.0
          2014-12-29      -5.0    0.0    0.0  

如果不需要排除 0 到 0 的更改,df.groupby(level=0).diff() 可以正常工作。

我可以设计一种方法来查看行来执行此操作,但数据框非常庞大(数万名客户和数十个项目),因此这不会成功。我认为有一种方法可以通过 .apply() 操作来做到这一点,但我现在还不能完全解决这个问题。

你快到了,添加 .mask

 df.groupby(level=0).diff().mask(df==0)
    Out[740]: 
                         Item1  Item2  Item3
    Customer date                           
    1        2014-03-24    NaN    NaN    NaN
             2014-06-23    NaN   10.0   10.0
             2014-09-22    NaN    0.0  -20.0
             2014-12-22    3.0   10.0  -20.0
    2        2014-03-24    NaN    NaN    NaN
             2014-06-23    NaN   10.0   10.0
             2014-09-22    NaN    0.0  -20.0
             2014-12-22    4.0   10.0  -20.0
    3        2014-03-24    NaN    NaN    NaN
             2014-06-23    NaN   10.0   10.0
             2014-09-22    NaN    0.0  -20.0
             2014-12-22    5.0   10.0  -20.0

编辑:

df.groupby(level=0).diff().mask(df.groupby(level='Customer').apply(lambda x: (x==0).cumprod())==1)