Tengo un DataFrame con fechas , categorías y una columna que muestra si ha ocurrido un evento único para esa categoría. Quiero crear una nueva columna con el tiempo hasta que ocurra el evento, o algún indicador de que no haya ningún evento, como un tiempo negativo.
El conjunto de datos es bastante grande, e imagino que hay una mejor solución que forzar esto con bucles que alguien mejor con Pandas sabría.
Entonces, en resumen, si creo mi conjunto de datos de esta manera:
import pandas as pd
#create example dataset
data = {'categories':['a','b','c']*4,'dates':[i for i in range(4) for j in range(3)],'event':[0]*3*4}
#add a couple of events
data['event'][4] = 1
data['event'][9] = 1
df = pd.DataFrame(data)
¿Cuál es la mejor manera de llegar a una salida que se vea así?
categories dates event time_until
0 a 0 0 3
1 b 0 0 1
2 c 0 0 -1
3 a 1 0 2
4 b 1 1 0
5 c 1 0 -1
6 a 2 0 1
7 b 2 0 -1
8 c 2 0 -1
9 a 3 1 0
10 b 3 0 -1
11 c 3 0 -1
¡Gracias por tu ayuda!
Utilizando groupby
def f(s):
s = s.reset_index(drop=True)
one = s[s.eq(1)]
if one.empty: return -1
return -s.index + one.index[0]
df.groupby('categories').event.transform(f)
categories dates event time_until
0 a 0 0 3
1 b 0 0 1
2 c 0 0 -1
3 a 1 0 2
4 b 1 1 0
5 c 1 0 -1
6 a 2 0 1
7 b 2 0 -1
8 c 2 0 -1
9 a 3 1 0
10 b 3 0 -2
11 c 3 0 -1
Observe que esto encuentra la distancia incluso después de que sucedió el evento. Entonces, para el siguiente evento, obtienes el siguiente resultado
event = [0, 0, 0, 1, 0, 0]
until = [3, 2, 1, 0, -1, -2]
Si necesita perpetuar todos los valores negativos con -1
, simplemente ajuste al final
df.time_until.where(df.time_until >= -1, -1)
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras