У меня был похожий (очень грязный, сгенерированный опросом) набор данных, который я использовал melt
, merge
и groupby-transform-cumcount
, чтобы получить желаемое число
работает с вашим предположением, что ваш набор данных называется df:
#First melt the DF and the unique visits (you'll have to do this for all your value_vars)
df1 = pd.melt(df,id_vars='Client',value_vars=['Visit_1','Visit_2','Visit_3'],var_name='Visit',value_name='Visit Date')
print(df1.head(5))
Client Visit Visit Date
0 Client_1 Visit_1 2018-01-01
1 Client_2 Visit_1 2018-01-10
2 Client_3 Visit_1 2018-01-20
3 Client_4 Visit_1 2018-01-30
4 Client_5 Visit_1 2018-04-02
#lets do the same for the deliveries
df2 = pd.melt(df,id_vars='Client',value_vars=['Deliv_1','Deliv_2','Deliv_3'],var_name='Delivery',value_name='Check')
после плавления мы можем объединить ваши значения обратно в табличный стиль df.
# Lets merge these and then put the Key_DT back on
res = pd.merge(df1,df2,on='Client')
res = pd.merge(res,df[['Client','Key_DT']],on='Client')
print(res.head(5))
Client Visit Visit Date Delivery Check Key_DT
0 Client_1 Visit_1 2018-01-01 Deliv_1 No 2018-01-15
1 Client_1 Visit_1 2018-01-01 Deliv_2 Yes 2018-01-15
2 Client_1 Visit_1 2018-01-01 Deliv_3 Yes 2018-01-15
3 Client_1 Visit_2 2018-01-20 Deliv_1 No 2018-01-15
4 Client_1 Visit_2 2018-01-20 Deliv_2 Yes 2018-01-15
позволяет фильтровать по вашим условиям и подсчитывать значения по Client
s = res.loc[(res['Key_DT'] >= '2018-01-20') & (res['Key_DT'] <= '2018-03-25') & (res.Check == 'Yes')]
res['visit_sum'] = s.groupby(['Client','Visit'])['Check'].transform('cumcount')
res['visit_sum'] = res['visit_sum'].fillna(0)
print(res.loc[res['visit_sum'] > 0])
Client Visit Visit Date Delivery Check Key_DT visit_sum
27 Client_4 Visit_1 2018-01-30 Deliv_1 Yes 2018-02-25 1.0
29 Client_4 Visit_1 2018-01-30 Deliv_3 Yes 2018-02-25 1.0
30 Client_4 Visit_2 2018-03-01 Deliv_1 Yes 2018-02-25 1.0
32 Client_4 Visit_2 2018-03-01 Deliv_3 Yes 2018-02-25 1.0
33 Client_4 Visit_3 2018-03-10 Deliv_1 Yes 2018-02-25 1.0
35 Client_4 Visit_3 2018-03-10 Deliv_3 Yes 2018-02-25 1.0
надеюсь, что сортирует подсказок и помогает вам достичь желаемого результата.