Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中检查2年内数据帧的条件_Python_Pandas_Dataframe_Time Series - Fatal编程技术网

在Python中检查2年内数据帧的条件

在Python中检查2年内数据帧的条件,python,pandas,dataframe,time-series,Python,Pandas,Dataframe,Time Series,我有一个如下的数据帧。我需要一个额外的列来检查是否每个客户端在过去的2年中都有默认值=1。对于ID=1的以下客户,前4行应返回0,而对于其余行,应在2011年11月返回1作为默认值=1,此客户端的最新日期为2013年3月,即2年内 cust_ID, date, default 1 2/1/11 0 1 3/1/11 0 1 6/1/11 0 1 9/1/11 0 1 11/1

我有一个如下的数据帧。我需要一个额外的列来检查是否每个客户端在过去的2年中都有默认值=1。对于ID=1的以下客户,前4行应返回0,而对于其余行,应在2011年11月返回1作为默认值=1,此客户端的最新日期为2013年3月,即2年内

   cust_ID, date, default

   1       2/1/11   0

   1       3/1/11   0

   1       6/1/11   0

   1       9/1/11   0

   1       11/1/11  1

   1       12/1/11  0

   1       3/1/12   0

   1       5/1/12   0

   1       8/1/12   0

   1       9/1/12   0

   1       10/1/12  0

   1       11/1/12  0

   1       12/1/12  0

   1       1/1/13   0

   1       2/1/13   0

   1       3/1/13   0


我认为您需要链2掩码-检查日期是否小于减去2年的最大日期,然后检查累计总和是否不是
0

df['date'] = pd.to_datetime(df['date'], format='%m/%d/%y')

m1=df.groupby('cust_ID')['date'].transform('max').sub(pd.DateOffset(years=2)).lt(df['date'])

m2=df.groupby('cust_ID')['default'].cumsum().ne(0)

df['new'] = (m1 & m2).astype(int)
print (df)
    cust_ID       date  default  new
0         1 2011-02-01        0    0
1         1 2011-03-01        0    0
2         1 2011-06-01        0    0
3         1 2011-09-01        0    0
4         1 2011-11-01        1    1
5         1 2011-12-01        0    1
6         1 2012-03-01        0    1
7         1 2012-05-01        0    1
8         1 2012-08-01        0    1
9         1 2012-09-01        0    1
10        1 2012-10-01        0    1
11        1 2012-11-01        0    1
12        1 2012-12-01        0    1
13        1 2013-01-01        0    1
14        1 2013-02-01        0    1
15        1 2013-03-01        0    1

这里的解决方案不完全是两年,而是2*365,25天:

my_df.set_index('date', inplace=True) # set the date as index
my_df['result'] = (my_df['default'].rolling('731D').sum > 0).astype(int)

它也有用!谢谢!