2017-06-02 70 views
1

我有一个看起来像这样的医疗事务数据:求和特定的时间窗口在Python熊猫

id date amt code 
124 1/14/12 135 P 
124 1/15/12 135 P 
124 1/16/12 135 P 
124 1/17/12 135 R 
124 2/12/12 135 P 
124 2/14/12 135 R 
124 2/29/12 142 P 
124 2/30/12 159 P 
192 2/12/12 922 P 
192 2/13/12 922 R 
192 2/25/12 124 P 
192 2/26/12 40 P 
135 2/17/12 721 P 
135 2/20/12 100 P 

的“P”代码表示的支付,而“R”代码表示回报。我需要确定在过去10天内有超过2次付款的病人,总额超过100美元。诀窍是我需要每天都这样做,因此个人可以在一个月内多次触发此逻辑(例如,从2012年1月15日开始的两个交易以及从1/16/12个应该每个触发一次,另外2个事务在2/30/12触发这个逻辑)。

是什么让这个问题更复杂是我必须忽略已经返回付款代码的患者。因此,如果患者'124'在2012年1月15日有2次付款并在1/17/12年有回报,他们不应该被标记,但他们应该在2012年1月14日标记每次交易& 1/15/12和2/29/12和2/30/12。最终的数据应该是这样的:

id flag_date count amt 
124 1/15/12 2 270 
124 1/16/12 3 405 
124 2/30/12 2 301 
192 2/26/12 2 164 
135 2/20/12 2 821 

回答

2

我必须确保我们有一个datetime列

df.date = pd.to_datetime(df.date) 

df.sort_values('date') \ 
    .assign(code=df.code.eq('P')) \ 
    .groupby('id').rolling('10d', on='date')[['amt', 'code']].sum() \ 
    .query('code >= 2 and amt > 100').reset_index() 

    id  date amt code 
0 124 2012-01-15 270.0 2.0 
1 124 2012-01-16 405.0 3.0 
2 124 2012-01-17 540.0 3.0 
3 124 2012-02-29 301.0 2.0 
4 135 2012-02-20 821.0 2.0 
5 192 2012-02-26 164.0 2.0 
+0

这是非常接近我想要的输出,除了指数第2行和第3行 - 这些不应被标记,因为它们在期望的窗口中有回报付款... – Daniel

+0

@Daniel测试您的数据上的代码。我必须增加数据,因为你有2月30日的错误。 – piRSquared

+0

我收到以下错误:ValueError:指定为日期时无效,必须是列(如果是DataFrame)或无 使用python 2.7 – Daniel