¿Cómo obtengo solo las filas que vienen después del 'clic' en la columna 'action_type' para cada client_id los datos del juguete?
df = pd.DataFrame({ 'user_client_id': [1,1, 1, 1, 1,1, 1,1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 'timestamp':['2021-12-18 09:15:59', '2021-12-18 10:33:49', '2021-12-18 10:34:08', '2021-12-18 10:34:09', '2021-12-18 10:57:02','2021-12-18 10:57:33','2021-12-18 10:58:01','2021-12-18 10:58:02','2021-12-18 10:58:17', '2021-12-18 10:58:29','2021-12-18 10:58:31','2021-12-18 10:58:34', '2021-12-18 10:58:34','2021-12-18 10:58:47', '2021-12-18 10:59:12', '2021-12-18 10:59:28','2021-12-18 10:59:35','2021-12-18 10:59:38','2021-12-18 11:05:13', '2021-12-18 11:05:58','2021-12-18 11:06:08','2021-12-18 11:06:10','2021-12-18 11:06:12','2021-12-18 11:07:42', '2021-12-18 11:10:07','2021-12-18 11:10:23', '2021-12-18 11:10:53', '2021-12-18 11:10:58', '2021-12-18 11:13:04', '2021-12-18 11:13:06', '2021-12-18 14:56:32','2021-12-18 17:16:40'], 'action_type ': ['to_cart','to_cart','to_cart','to_cart','click', 'to_cart', 'to_cart', 'increment', 'remove', 'to_cart', 'increment', 'click', 'to_cart', 'increment', 'to_cart', 'to_cart', 'remove', 'to_cart', 'increment', 'to_cart', 'to_cart', 'click', 'increment', 'to_cart', 'to_cart', 'to_cart', 'click', 'increment', 'to_cart', 'increment', 'to_cart', 'increment'] })Para el cliente con ID 1, todo lo que viene antes del clic en 2021-12-18 10:57:02 debe filtrarse para el cliente con ID 2, todo lo que viene antes del clic en 2021-12-18 11:06:10 debe ser filtrado
Lo he intentado de esta manera, pero solo funciona para el cliente 1, pero no funciona para el cliente 2
df.iloc[df.loc[df['action_type']=='click'].index[0]:,:]Cada vez que dice "por cliente", es una buena señal de que necesita un groupby . En cuanto a filtrar las filas antes del primer clic, puede contar el número acumulado de clics y luego obtener solo las filas donde los clics > 0:
def filter(group): click = group['action_type'].eq('click').cumsum() return group[click > 0] df.groupby('user_client_id').apply(filter).reset_index(level=0, drop=True)Puede usar una máscara con groupby y cummax . Esto establecerá todos los valores por grupo en Verdadero después del primer "clic"
m = (df['action_type'].eq('click') .groupby(df['user_client_id']) .cummax() ) df[m]Producción:
user_client_id timestamp action_type 4 1 2021-12-18 10:57:02 click 5 1 2021-12-18 10:57:33 to_cart 6 1 2021-12-18 10:58:01 to_cart 7 1 2021-12-18 10:58:02 increment 8 1 2021-12-18 10:58:17 remove 9 1 2021-12-18 10:58:29 to_cart 10 1 2021-12-18 10:58:31 increment 11 1 2021-12-18 10:58:34 click 12 1 2021-12-18 10:58:34 to_cart 13 1 2021-12-18 10:58:47 increment 14 1 2021-12-18 10:59:12 to_cart 21 2 2021-12-18 11:06:10 click 22 2 2021-12-18 11:06:12 increment 23 2 2021-12-18 11:07:42 to_cart 24 2 2021-12-18 11:10:07 to_cart 25 2 2021-12-18 11:10:23 to_cart 26 2 2021-12-18 11:10:53 click 27 2 2021-12-18 11:10:58 increment 28 2 2021-12-18 11:13:04 to_cart 29 2 2021-12-18 11:13:06 increment 30 2 2021-12-18 14:56:32 to_cart 31 2 2021-12-18 17:16:40 increment