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?

3voto

Mykola Zotko Punkte 11977

Um Zeilen mit den Indizes 1, 2, 4 zu löschen, können Sie verwenden:

df[~df.index.isin([1, 2, 4])]

Der Tilde-Operator ~ negiert das Ergebnis der Methode isin . Eine weitere Möglichkeit ist das Fallenlassen von Indizes:

df.loc[df.index.drop([1, 2, 4])]

2voto

kash1210 Punkte 21

Sehen Sie sich den folgenden Datenrahmen df an

df

   column1  column2  column3
0        1       11       21
1        2       12       22
2        3       13       23
3        4       14       24
4        5       15       25
5        6       16       26
6        7       17       27
7        8       18       28
8        9       19       29
9       10       20       30

Lassen wir alle Zeilen weg, die eine ungerade Zahl in Spalte 1 haben

Erstellen Sie eine Liste aller Elemente in Spalte 1 und behalten Sie nur die Elemente mit geraden Zahlen (die Elemente, die Sie nicht löschen wollen)

keep_elements = [x for x in df.column1 if x%2==0]

Alle Zeilen mit den Werten [2, 4, 6, 8, 10] in seiner Spalte1 wird beibehalten oder nicht gelöscht.

df.set_index('column1',inplace = True)
df.drop(df.index.difference(keep_elements),axis=0,inplace=True)
df.reset_index(inplace=True)

Wir machen die Spalte1 als Index und lassen alle nicht benötigten Zeilen weg. Dann setzen wir den Index wieder zurück. df

   column1  column2  column3
0        2       12       22
1        4       14       24
2        6       16       26
3        8       18       28
4       10       20       30

2voto

Mad Physicist Punkte 93794

Als Die Antwort von Dennis Golomazov schlägt vor, mit drop um Zeilen zu löschen. Sie können stattdessen wählen, dass die Zeilen beibehalten werden. Nehmen wir an, Sie haben eine Liste von Zeilenindizes, die Sie löschen wollen, mit dem Namen indices_to_drop . Sie können sie wie folgt in eine Maske umwandeln:

mask = np.ones(len(df), bool)
mask[indices_to_drop] = False

Sie können diesen Index direkt verwenden:

df_new = df.iloc[mask]

Das Schöne an dieser Methode ist, dass mask kann aus einer beliebigen Quelle stammen: Es kann sich um eine Bedingung handeln, die mehrere Spalten betrifft, oder um etwas anderes.

Das Schöne daran ist, dass Sie den Index des ursprünglichen DataFrame gar nicht benötigen, so dass es keine Rolle spielt, ob der Index eindeutig ist oder nicht.

Der Nachteil ist natürlich, dass man bei dieser Methode nicht an Ort und Stelle fallen lassen kann.

0voto

Mainland Punkte 3417

Betrachten Sie ein Beispiel für einen Datenrahmen

df =     
index    column1
0           00
1           10
2           20
3           30

wir wollen die 2. und 3. Indexzeile fallen lassen.

Ansatz 1:

df = df.drop(df.index[2,3])
 or 
df.drop(df.index[2,3],inplace=True)
print(df)

df =     
index    column1
0           00
3           30

 #This approach removes the rows as we wanted but the index remains unordered

Ansatz 2

df.drop(df.index[2,3],inplace=True,ignore_index=True)
print(df)
df =     
index    column1
0           00
1           30
#This approach removes the rows as we wanted and resets the index.

0voto

The_Data_Guy Punkte 123

Das hat bei mir funktioniert

# Create a list containing the index numbers you want to remove
index_list = list(range(42766, 42798))
df.drop(df.index[index_list], inplace =True)
df.shape

Dies sollte alle Indizes innerhalb des erstellten Bereichs löschen

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