Establecer valores de columna basados en la búsqueda de otra columna

Laukei

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!

rafaelc

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

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

Obtener valores de columna basados en cambios en otra columna

Obtener valores de columna basados en cambios en otra columna

Encuentre los valores mínimos de la columna df basados en otra columna

Encuentre los valores mínimos de la columna df basados en otra columna

Obtener valores basados en el máximo de otra columna

Pandas, resta valores basados en el valor de otra columna

Python: genera valores para una nueva columna mediante la búsqueda de listas de comodines en otra columna

Agregar valores de una columna basados en valores en otra columna en pandas

Copiar los valores de una columna, basados en los valores de otra columna

Obtenga valores distintos de una columna basados en valores distintos en otra columna usando R

Agregar nueva columna con valores basados en condiciones en valores de otra columna

Actualizar valores de columna basados en valores iguales en otra columna

R: ¿Cómo crear una nueva columna con valores basados en ciertos valores de otra columna?

Valores de Python Shift en una columna basados en Nan o booleanos en otra columna

Cree una nueva columna con valores vectoriales basados en grupos de otra columna de caracteres

Oracle SQL: obtenga el recuento de valores de columna distintos basados en otra columna

Dividir valores de columna basados en delimitadores y coincidencias con otra columna en postgres

Búsqueda de subcadenas en una columna de la columna de otra tabla sin el operador IN

crear una columna basada en la búsqueda de valores de fila en otra tabla de datos

crear una columna basada en la búsqueda de valores de fila en otra tabla de datos

Sumar valores de una columna basados en otra columna booleana, tanto verdaderos como falsos por separado

Compare los valores de una columna en la tabla A y otra columna en la tabla B

Asignación de valores basados en parte de la columna

Asignación de valores basados en parte de la columna

Búsqueda de valores de columna en otra hoja de trabajo

contar valores de texto únicos basados en la condición en otra columna entre los criterios de fecha

Crea grupos basados en valores de columna

Valores promedio de una columna basados en los valores de otra

Mostrar valores de listagg basados en valores en otra columna (parte 2)

TOP Lista

CalienteEtiquetas

Archivo