1030 Stimmen

Löschen von DataFrame-Zeile in Pandas basierend auf dem Spaltenwert

Ich habe das folgende DataFrame:

             daysago  line_race rating        rw    wrating
 line_date                                                 
2007-03-31       62         11     56  1.000000  56.000000
2007-03-10       83         11     67  1.000000  67.000000
2007-02-10      111          9     66  1.000000  66.000000
2007-01-13      139         10     83  0.880678  73.096278
2006-12-23      160         10     88  0.793033  69.786942
2006-11-09      204          9     52  0.636655  33.106077
2006-10-22      222          8     66  0.581946  38.408408
2006-09-29      245          9     70  0.518825  36.317752
2006-09-16      258         11     68  0.486226  33.063381
2006-08-30      275          8     72  0.446667  32.160051
2006-02-11      475          5     65  0.164591  10.698423
2006-01-13      504          0     70  0.142409   9.968634
2006-01-02      515          0     64  0.134800   8.627219
2005-12-06      542          0     70  0.117803   8.246238
2005-11-29      549          0     70  0.113758   7.963072
2005-11-22      556          0     -1  0.109852  -0.109852
2005-11-01      577          0     -1  0.098919  -0.098919
2005-10-20      589          0     -1  0.093168  -0.093168
2005-09-27      612          0     -1  0.083063  -0.083063
2005-09-07      632          0     -1  0.075171  -0.075171
2005-06-12      719          0     69  0.048690   3.359623
2005-05-29      733          0     -1  0.045404  -0.045404
2005-05-02      760          0     -1  0.039679  -0.039679
2005-04-02      790          0     -1  0.034160  -0.034160
2005-03-13      810          0     -1  0.030915  -0.030915
2004-11-09      934          0     -1  0.016647  -0.016647

Ich muss die Zeilen entfernen, in denen line_race gleich 0 ist. Was ist der effizienteste Weg, dies zu tun?

6voto

Uzair Punkte 317

Ich habe meinen Code kompiliert und ausgeführt. Dies ist genauer Code. Du kannst es selbst ausprobieren.

data = pd.read_excel('file.xlsx')

Wenn du ein Sonderzeichen oder Leerzeichen im Spaltennamen hast, kannst du es im gegebenen Code so schreiben:

data = data[data['expire/t'].notnull()]
print (date)

Wenn es nur einen einzelnen String-Spaltennamen ohne Leerzeichen oder Sonderzeichen gibt, kannst du direkt darauf zugreifen.

data = data[data.expire ! = 0]
print (date)

4voto

sdkayb Punkte 146

Es wurden so viele Optionen bereitgestellt (oder vielleicht habe ich nicht viel darauf geachtet, sorry, wenn das der Fall ist), aber niemand hat dies erwähnt: Wir können in Pandas diese Notation verwenden: ~ (dies gibt uns das Inverse der Bedingung)

df = df[~df["line_race"] == 0]

3voto

Nur eine andere Möglichkeit, ein DataFrame über alle Spalten erweitert:

for column in df.columns:
   df = df[df[column]!=0]

Beispiel:

def z_score(data,count):
   threshold=3
   for column in data.columns:
       mean = np.mean(data[column])
       std = np.std(data[column])
       for i in data[column]:
           zscore = (i-mean)/std
           if(np.abs(zscore)>threshold):
               count=count+1
               data = data[data[column]!=i]
   return data,count

3voto

juan escorcia Punkte 97

Nur für den Fall, dass Sie die Zeile löschen müssen, aber der Wert sich in verschiedenen Spalten befinden kann. In meinem Fall habe ich Prozentsätze verwendet, also wollte ich die Zeilen löschen, die in einer Spalte den Wert 1 haben, da dies bedeutet, dass es 100% ist.

for x in df:
    df.drop(df.loc[df[x]==1].index, inplace=True)

Ist nicht optimal, wenn Ihr df zu viele Spalten hat.

1voto

not a robot Punkte 3525

Wenn Sie Zeilen basierend auf Indexwerten entfernen müssen, kann die boolesche Indizierung in der obersten Antwort ebenfalls angepasst werden. Zum Beispiel werden in dem folgenden Code Zeilen entfernt, bei denen der Index zwischen 3 und 7 liegt.

df = pd.DataFrame({'A': range(10), 'B': range(50,60)})

x = df[(df.index < 3) | (df.index > 7)]
# oder äquivalent
y = df[~((df.index >= 3) & (df.index <= 7))]

# oder mit Hilfe von Abfragen
z = df.query("~(3 <= index <= 7)")

# wenn der Index einen Namen hat (wie im OP), verwenden Sie den Namen
# um Zeilen im Jahr 2007 auszuwählen:
df.query("line_date.dt.year == 2007")

Wie bereits von anderen erwähnt, ist query() eine sehr lesbare Funktion, die für diese Aufgabe perfekt ist. Tatsächlich ist es für große Dataframes die schnellste Methode für diese Aufgabe (siehe diese Antwort für Benchmark-Ergebnisse).

Einige häufige Fragen zu query():

  1. Verwenden Sie für Spaltennamen mit Leerzeichen Anführungszeichen.

    df = pd.DataFrame({'col A': [0, 1, 2, 0], 'col B': ['a', 'b', 'cd', 'e']})
    
    # Umgeben Sie einen Spaltennamen mit Leerzeichen mit Anführungszeichen
    x = df.query('`col A` != 0')
  2. Um auf Variablen in der lokalen Umgebung zu verweisen, fügen Sie ein @ hinzu.

    to_exclude = [0, 2]
    y = df.query('`col A` != @to_exclude')
  3. Es können auch Serienmethoden aufgerufen werden.

    # Entfernen Sie Zeilen, in denen die Länge des Strings in Spalte B nicht 1 beträgt
    z = df.query("`col B`.str.len() == 1")

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