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)
我有一个 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)