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