我拥有客户的数据集及其政策,我试图找到客户与我们在一起的月数。 (任期)
df
cust_no poly_no start_date end_date
1 1 2016-06-01 2016-08-31
1 2 2017-05-01 2018-05-31
1 3 2016-11-01 2018-05-31
输出应该看起来像
cust_no no_of_months
1 22
因此,基本上,它应该摆脱没有政策的月份,并且将重叠期计算一次而不是两次。我必须为每个客户执行此操作,所以按cust_no分组,我该怎么做?
谢谢。
答案 0 :(得分:1)
执行此操作的一种方法是为每个记录创建日期范围,然后使用堆栈获取所有月份。接下来,仅使用唯一值仅计算一个月一次:
s = df.apply(lambda x: pd.Series(pd.date_range(x.start_date, x.end_date, freq='M').values), axis=1)
ss = s.stack().unique()
ss.shape[0]
输出:
22
答案 1 :(得分:0)
对于多个客户,您可以使用groupby
。继续@ScottBoston's answer:
df_range = df.apply(lambda r: pd.Series(
pd.date_range(start=r.start_date, end=r.end_date, freq='M')
.values), axis=1)
df_range.groupby('cust_no').apply(lambda x: x.stack().unique().shape[0])