python 3.x - ¿Cómo puedo colocar filas en marcos de datos que contienen listas vacías?
python-3.x pandas (6)
He creado un marco de datos con 3 columnas, el tercero contiene listas, quiero eliminar filas que contengan una lista vacía en esa celda.
Lo he intentado con
df[df.numbers == []] and df[df.numbers == null]
but nothing works.
name country numbers
Lewis Spain [1,4,6]
Nora UK []
Andrew UK [3,5]
El resultado será un marco de datos sin la fila de Nora.
Digamos que sus datos están configurados de esta manera:
import pandas as pd
df = pd.DataFrame([{''name'': "Lewis", ''country'': "Spain", "numbers": [1,4,6]},
{''name'': "Nora", ''country'': "UK", "numbers": []},
{''name'': "Andrew", ''country'': "UK", "numbers": [3,5]}])
Podría iterar sobre el marco de datos y agregar solo las filas que no tienen una matriz de números vacía a un nuevo marco de datos llamado "newDF". Por ejemplo:
newDFArray = []
for index, row in df.iterrows():
emptyArrayCheck = row["numbers"]
if len(emptyArrayCheck) > 0:
newDFArray.append(row)
newDF = pd.DataFrame(newDFArray)
newDF
Esto dará lugar a:
country name numbers
0 Spain Lewis [1, 4, 6]
2 UK Andrew [3, 5]
Umm cheque
bool
df[df.numbers.astype(bool)]
Una forma de hacerlo es crear una nueva columna que contenga la longitud de df.numbers mediante:
df[''len''] = df.apply(lambda row: len(row.numbers), axis=1)
y luego filtre por esa columna haciendo:
df[df.len > 0]
Usando la idea de que el resultado de cualquier lista multiplicada por 0 da una lista vacía, una forma de hacer esto es:
In [29]: df[df.numbers != df.numbers * 0]
Out[29]:
name numbers country
0 Lewis [1, 4, 6] Spain
2 Andrew [3, 5] UK
Use
series.str.len()
para verificar la longitud de los elementos en la lista y luego filtre donde es igual a 0:
df[~df.numbers.str.len().eq(0)]
name country numbers
0 Lewis Spain [1, 4, 6]
2 Andrew UK [3, 5]
solo comprueba len> 0
df[df[''numbers''].str.len()>0]