Tengo un marco de datos con una columna con valores de lista y otra columna con solo 1 elemento en una lista. Quiero seleccionar valores de la columna id por una condición en la columna canceled y luego hacer otra columna C con los valores seleccionados.
La columna cancelada es el número de códigos cancelados. Necesito cambiar el cancelado a int y cortar la columna I con el número de cancelado y luego devolver un número aleatorio de la columna I. Es decir, digamos el código 11AS. Elegiré al azar 1 identificación de la matriz y crearé otra fila con la identificación cancelada. Para el código 22AS, ya que es 0, no cortaré nada, por lo que no devolveré ningún valor en la columna recién creada, por lo que esto se reducirá a todas las filas.

code    canceled  id
xxx     [1.0]     [107385, 128281, 133015]
xxS     [0.0]     [108664, 110515, 113556]
ssD     [1.0]     [134798, 133499, 125396, 114298, 133915]
cvS     [0.0]     [107611]
eeS     [5.0]     [113472, 115236, 108586, 128043, 114106, 10796...
544W    [44.0]    [107650, 128014, 127763, 118036, 116247, 12802.

Traté de recorrer y cortar, pero no pude obtener lo que quería. Digamos que px es mi DataFrame.

for i in px['canceled']:
    print(px['id'].str.slice(stop=int(i[0])))
1
Lwanga 26 sep. 2019 a las 12:32

1 respuesta

La mejor respuesta

¿Qué pasa con el uso de apply junto con random.sample de la siguiente manera

import random

px['C'] = px.apply(
    lambda datum : random.sample(
        datum.id, k=int(datum.canceled[0])
    ),
    axis = 1
)

Que puede devolver (recordando que la columna C se genera aleatoriamente)

code    canceled       id                                         C
xxS     [1.0]          [107385, 128281, 133015]                   [128281]
xxxxS   [0.0]          [108664, 110515, 113556]                   []
ssOD    [1.0]          [134798, 133499, 125396, 114298, 133915]   [114298]
45AS    [0.0]          [107611]                                   []
...     ...            ...                                        ...

int(datum.canceled[0]) datum.id datum.id
def random_codes_sampler(datum):
    ids = datum.id
    nbc = int(datum.canceled[0])
    if nbc >= len(ids):
        return ids
    return random.sample(ids, k=nbc)

px['C'] = px.apply(
    random_codes_sampler, axis = 1
)
1
keepAlive 11 nov. 2019 a las 08:44