web-dev-qa-db-fra.com

Supprimer les lignes avec des listes vides de pandas dataframe

J'ai un bloc de données avec quelques colonnes avec des listes vides et d'autres avec des listes de chaînes:

       donation_orgs                              donation_context
0            []                                           []
1   [the research of Dr. ...]   [In lieu of flowers , memorial donations ...]

J'essaie de renvoyer un ensemble de données sans aucune des lignes où il y a des listes vides.

J'ai juste essayé de vérifier les valeurs nulles:

dfnotnull = df[df.donation_orgs != []]
dfnotnull

et

dfnotnull = df[df.notnull().any(axis=1)]
pd.options.display.max_rows=500
dfnotnull

Et j'ai essayé de parcourir et de vérifier les valeurs qui existent, mais je pense que les listes ne renvoient pas Null ou None comme je le pensais:

dfnotnull = pd.DataFrame(columns=('donation_orgs', 'donation_context'))
for i in range(0,len(df)):
    if df['donation_orgs'].iloc(i):
        dfnotnull.loc[i] = df.iloc[i]

Les trois méthodes ci-dessus renvoient simplement chaque ligne du bloc de données d'origine. =

21
Ben Price

Vous pouvez essayer de découper comme si le bloc de données était des chaînes au lieu de listes:

import pandas as pd
df = pd.DataFrame({
'donation_orgs' : [[], ['the research of Dr.']],
'donation_context': [[], ['In lieu of flowers , memorial donations']]})

df[df.astype(str)['donation_orgs'] != '[]']

Out[9]: 
                            donation_context          donation_orgs
1  [In lieu of flowers , memorial donations]  [the research of Dr.]
16
Woody Pride

Pour éviter de convertir en str et utiliser réellement les lists, vous pouvez procéder comme suit:

df[df['donation_orgs'].map(lambda d: len(d)) > 0]

Il mappe le donation_orgs colonne à la longueur des listes de chaque ligne et ne conserve que celles qui ont au moins un élément, filtrage des listes vides.

Il revient

Out[1]: 
                            donation_context          donation_orgs
1  [In lieu of flowers , memorial donations]  [the research of Dr.]

comme prévu.

16
Victor

Vous pouvez utiliser la doublure suivante:

df[(df['donation_orgs'].str.len() != 0) | (df['donation_context'].str.len() != 0)]
4
Amirhos Imani