Estoy buscando convertir una celda de pandas que contiene una lista en filas para cada uno de esos valores.
Entonces, toma esto:
Si quisiera descomprimir y apilar los valores en la nearest_neighbors
columna para que cada valor sea una fila dentro de cada opponent
índice, ¿cuál es la mejor manera de hacerlo ? ¿Hay métodos pandas que estén destinados a operaciones como esta?
pd.DataFrame(df.nearest_neighbors.values.tolist())
para descomprimir esta columna y luegopd.merge
pegarla con las demás.values.tolist()
haga nada aquí; la columna ya es una listaRespuestas:
En el siguiente código, primero restablezco el índice para facilitar la iteración de la fila.
Creo una lista de listas donde cada elemento de la lista externa es una fila del DataFrame de destino y cada elemento de la lista interna es una de las columnas. Esta lista anidada finalmente se concatenará para crear el DataFrame deseado.
Utilizo una
lambda
función junto con la iteración de la lista para crear una fila para cada elemento delnearest_neighbors
emparejado con el relevantename
yopponent
.Finalmente, creo un nuevo DataFrame a partir de esta lista (usando los nombres de las columnas originales y volviendo a establecer el índice en
name
yopponent
).EDITAR JUNIO 2017
Un método alternativo es el siguiente:
fuente
apply(pd.Series)
está bien en los marcos más pequeños, pero para los marcos de tamaño razonable, debe reconsiderar una solución más eficaz. Consulte ¿ Cuándo debería usar pandas apply () en mi código? (Una mejor solución es enumerar la columna primero.)explode()
método. Agregué una respuesta con un ejemplo usando la misma configuración de df que aquí.explode()
método:Fuera:
fuente
Utilice
apply(pd.Series)
ystack
, luegoreset_index
yto_frame
Detalles
fuente
df.nearest_neighbors.apply(pd.Series)
es muy sorprendente para mí;Creo que esta es una muy buena pregunta, en Hive que usaría
EXPLODE
, creo que se puede argumentar que Pandas debería incluir esta funcionalidad de forma predeterminada. Probablemente explotaría la columna de la lista con una comprensión de generador anidada como esta:fuente
El método más rápido que encontré hasta ahora es extender el DataFrame
.iloc
y volver a asignar la columna de destino aplanada .Dada la entrada habitual (replicada un poco):
Dadas las siguientes alternativas sugeridas:
Encuentro que
extend_iloc()
es el más rápido :fuente
cols = [c for c in df.columns if c != col_target]
debería ser:cols = [i for i,c in enumerate(df.columns) if c != col_target]
Losdf.iloc[ilocations, cols].copy()
errores si no se presentan con el índice de la columna.Mejor solución alternativa con aplicar (serie pd.):
fuente
Similar a la funcionalidad EXPLODE de Hive:
fuente
NameError: global name 'copy' is not defined
Entonces, todas estas respuestas son buenas, pero quería algo ^ realmente simple ^ así que aquí está mi contribución:
Eso es todo ... solo usa esto cuando quieras una nueva serie donde las listas se 'exploten'. Aquí hay un ejemplo donde hacemos value_counts () en las opciones de tacos :)
fuente
A continuación, se muestra una posible optimización para marcos de datos más grandes. Esto se ejecuta más rápido cuando hay varios valores iguales en el campo "explosivo". (Cuanto mayor sea el marco de datos en comparación con el recuento de valores únicos en el campo, mejor funcionará este código).
fuente
Extendiendo la
.iloc
respuesta de Oleg para aplanar automáticamente todas las columnas de lista:Esto supone que cada columna de lista tiene la misma longitud de lista.
fuente
En lugar de utilizar apply (pd.Series), puede aplanar la columna. Esto mejora el rendimiento.
fuente