在Python中检查2年内数据帧的条件
我有一个如下的数据帧。我需要一个额外的列来检查是否每个客户端在过去的2年中都有默认值=1。对于ID=1的以下客户,前4行应返回0,而对于其余行,应在2011年11月返回1作为默认值=1,此客户端的最新日期为2013年3月,即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
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)
它也有用!谢谢!