Versuchen, drop von NaN indizierten Zeile in dataframe
Ich bin mit python 2.7.3 und Pandas version 0.12.0.
Möchte ich drop die Zeile mit der NaN-index, so dass ich nur noch gültig site_id Werte.
print df.head()
special_name
site_id
NaN Banana
OMG Apple
df.drop(df.index[0])
TypeError: 'NoneType' object is not iterable
Wenn ich versuche ein Drop einer Auswahl, wie diese:
df.drop(df.index[0:1])
Bekomme ich diesen Fehler:
AttributeError: 'DataFrame' object has no attribute 'special_name'
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich herausgefunden, dass der einfachste Weg ist, um den index zurücksetzen, löschen Sie NaN und setzen Sie dann den index erneut.
df.loc[df.index.dropna()]
funktioniert in den aktuellen Versionen.Mit pandas version >= 0.20.0 können Sie:
df[df.index.notnull()]
Mit älteren Versionen:
df[pandas.notnull(df.index)]
Um es zu brechen:
notnull
erzeugt ein boolean-Maske, z.B.[False, False, True]
, wo Wahre bezeichnet den Wert an der entsprechenden Stelle null ist (numpy.nan
oderNone
). Wir wählen dann die Zeilen, deren index entspricht, um einen true-Wert in der Maske durch die Verwendungdf[boolean_mask]
.df[df.index.notnull()]
Getestet, zu arbeiten :
df.reset_index(inplace=True)
df.drop(df[df['index'].isnull()].index, inplace=True)
, Wie ich überprüfte die oben
Repliziert die Tabelle in der ursprünglichen Frage der Verwendung
df=pd.DataFrame(data=['Banana', 'Apple'], index=[np.nan, 'OMG'],columns=['Special_name'])
dann geben Sie die beiden obigen code-Zeilen, die ich versuche zu erklären in der menschlichen Sprache unter:
df[df['index'].isnull()]
Filter Zeilen für die Spalte mit dem Namen 'index' zeigt 'NaN' - Werte mit isnull () - Befehl..index
verwendet, um eine eindeutige index-Objekt zeigt auf allen 'index'=NaN-Zeilen in diedf.drop(
im äußersten Teil des Ausdrucks.nb: getestet mit dem obigen Befehl, um die Arbeit auf mehrere NaN-Werte in einer Spalte
Mit Python 3.5.1 , Pandas 0.17.1 via Anaconda-Paket 32bits
Keiner der Antworten gearbeitet 100% für mich. Hier ist was funktioniert:
Als der
pandas
0.19,Index
es zu tun haben.notnull()
Methode, so die Antwort von timdiels kann vereinfacht werden zu:ich denke das ist (derzeit) die einfachste, die Sie bekommen können.
Edit: das folgende gilt wohl nur für
MultiIndex
s, und ist in jedem Fall wurde durch die neuedf.index.isnull()
- Funktion (siehe andere Antworten). Ich lasse diese Antwort nur für das historische Interesse.Für Menschen, die zu dieser jetzt, kann man das direkt tun, ohne reindexing, indem Sie sich auf die Tatsache, dass NaNs im index vertreten sein wird mit dem label
-1
. Also:Sogar besser, Pandas>0.16.1, man kann mit drop (), um dies zu tun inplace, ohne Sie zu kopieren:
NB: Es ist ein bisschen irreführend, dass der index-Ebene heißt "index": es würde in der Regel etwas mehr verwenden-spezifische wie "Datum" oder "experimental_run'..
Index
hat keinelabels
Attribut, Das vorgeschlagene drop führt zuAssertionError: axis must be a MultiIndex
.NaN
Werte und-1
Werte?labels
des index und nicht der index direkt:NaN
Werte im index vertreten sind, von-1
imlabels
. Ich glaube nicht, dass dielabels
Attribut kann je enthaltenNaN
.df.index.notnull()
Funktion. Ich lasse es stehen für das historische Interesse.