J'ai besoin de supprimer toutes les lignes dans lesquelles les éléments de la colonne 3 et suivants sont tous NaN
df = DataFrame(np.random.randn(6, 5), index=['a', 'c', 'e', 'f', 'g','h'], columns=['one', 'two', 'three', 'four', 'five'])
df2 = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
df2.ix[1][0] = 111
df2.ix[1][1] = 222
Dans l'exemple ci-dessus, mon cadre de données final ne comporterait pas les lignes «b» et «c».
Comment utiliser df.dropna()
dans ce cas?
Vous pouvez appeler dropna
avec les arguments subset
et how
:
df2.dropna(subset=['three', 'four', 'five'], how='all')
Comme les noms l'indiquent:
how='all'
exige que chaque colonne (de subset
) de la ligne soit NaN
pour pouvoir être supprimée, par opposition au 'any'
par défaut.subset
sont ces colonnes à inspecter pour NaN
s.Comme le souligne @PaulH , nous pouvons généraliser pour supprimer les dernières colonnes k
avec:
subset=df2.columns[k:]
En effet, nous pourrions même faire quelque chose de plus compliqué si vous le souhaitez:
subset=filter(lambda x: len(x) > 3, df2.columns)
Vous pouvez tester des cellules avec DataFrame.isna
, calculer un masque booléen avec DataFrame.all(axis=1)
, puis filtrer avec boolean indexing .
df2[~df2.loc[:, 'three':].isna().all(1)]
# Positional-slicing equivalent.
df2[~df2.iloc[:, 2:].isna().all(1)]
one two three four five
a 0.379093 1.194776 -0.836876 0.631553 1.662682
c 0.140634 0.101367 -0.093608 0.580299 -0.176149
e 0.135007 0.017431 -1.859338 -0.116581 -0.829589
f -0.937245 -0.578815 0.038284 -0.408336 -0.049235
g 0.006024 0.284959 -1.171995 -0.241687 -0.425308
h 0.783125 -0.750952 1.159392 1.249044 0.175651
Une autre option consiste à tester la valeur de DataFrame.count(axis=1)
pour qu’elle ne soit pas égale à 0:
df2[df2.iloc[:, 2:].count(1).ne(0)]
one two three four five
a 0.379093 1.194776 -0.836876 0.631553 1.662682
c 0.140634 0.101367 -0.093608 0.580299 -0.176149
e 0.135007 0.017431 -1.859338 -0.116581 -0.829589
f -0.937245 -0.578815 0.038284 -0.408336 -0.049235
g 0.006024 0.284959 -1.171995 -0.241687 -0.425308
h 0.783125 -0.750952 1.159392 1.249044 0.175651