Python Pandas条件优先差异

时间:2017-11-01 21:48:43

标签: python pandas diff

我有一个看起来像这样的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()操作来实现,但我现在还不能完全解决这个问题。

1 个答案:

答案 0 :(得分:1)

你几乎在那里,添加了.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)