348 Stimmen

Wie man eine Liste von Zeilen aus Pandas dataframe fallen?

Ich habe einen Datenrahmen df :

>>> df
                  sales  discount  net_sales    cogs
STK_ID RPT_Date                                     
600141 20060331   2.709       NaN      2.709   2.245
       20060630   6.590       NaN      6.590   5.291
       20060930  10.103       NaN     10.103   7.981
       20061231  15.915       NaN     15.915  12.686
       20070331   3.196       NaN      3.196   2.710
       20070630   7.907       NaN      7.907   6.459

Dann möchte ich Zeilen mit bestimmten Sequenznummern auslassen, die in einer Liste angegeben sind, z.B. [1,2,4], dann nach links:

                  sales  discount  net_sales    cogs
STK_ID RPT_Date                                     
600141 20060331   2.709       NaN      2.709   2.245
       20061231  15.915       NaN     15.915  12.686
       20070630   7.907       NaN      7.907   6.459

Wie oder welche Funktion kann das tun?

513voto

tzelleke Punkte 14893

Verwenden Sie DataFrame.drop und übergeben Sie ihm eine Reihe von Indexbezeichnungen:

In [65]: df
Out[65]: 
       one  two
one      1    4
two      2    3
three    3    2
four     4    1

In [66]: df.drop(index=[1,3])
Out[66]: 
       one  two
one      1    4
three    3    2

152voto

user3155053 Punkte 1945

Beachten Sie, dass es wichtig sein kann, den "inplace"-Befehl zu verwenden, wenn Sie die Drop-in-Linie machen wollen.

df.drop(df.index[[1,3]], inplace=True)

Da Ihre ursprüngliche Frage nichts zurückgibt, sollte dieser Befehl verwendet werden. http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.drop.html

76voto

Dennis Golomazov Punkte 14467

Wenn der DataFrame riesig ist und die Anzahl der zu löschenden Zeilen ebenfalls groß ist, dann ist ein einfaches Löschen nach Index df.drop(df.index[]) zu viel Zeit in Anspruch nimmt.

In meinem Fall habe ich einen mehrfach indizierten DataFrame von Floats mit 100M rows x 3 cols und ich muss die 10k Zeilen davon. Die schnellste Methode, die ich gefunden habe, ist, ganz kontraintuitiv, zu take die übrigen Zeilen.

Sea indexes_to_drop ein Array von Positionsindizes sein, die fallen gelassen werden sollen ( [1, 2, 4] in der Frage).

indexes_to_keep = set(range(df.shape[0])) - set(indexes_to_drop)
df_sliced = df.take(list(indexes_to_keep))

In meinem Fall dauerte dies 20.5s , während die einfache df.drop nahm 5min 27s und verbrauchte eine Menge Speicherplatz. Der resultierende DataFrame ist derselbe.

50voto

Ich habe das Problem auf eine einfachere Weise gelöst - in nur 2 Schritten.

  1. Erstellen Sie einen Datenrahmen mit unerwünschten Zeilen/Daten.

  2. Verwenden Sie den Index dieses unerwünschten Datenrahmens, um die Zeilen aus dem ursprünglichen Datenrahmen zu löschen.

Exemple :
Angenommen, Sie haben einen Datenrahmen df mit vielen Spalten, darunter "Alter", das eine ganze Zahl ist. Angenommen, Sie möchten alle Zeilen löschen, deren "Alter" eine negative Zahl ist.

df_age_negative = df[ df['Age'] < 0 ] # Step 1
df = df.drop(df_age_negative.index, axis=0) # Step 2

Ich hoffe, das ist viel einfacher und hilft Ihnen.

48voto

danielhadar Punkte 1842

Sie können auch an DataFrame.drop die Etikett selbst (anstelle von Serien von Indexetiketten):

In[17]: df
Out[17]: 
            a         b         c         d         e
one  0.456558 -2.536432  0.216279 -1.305855 -0.121635
two -1.015127 -0.445133  1.867681  2.179392  0.518801

In[18]: df.drop('one')
Out[18]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

Das ist gleichbedeutend mit:

In[19]: df.drop(df.index[[0]])
Out[19]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X