python löschen - Wie lösche ich Zeilen aus Pandas-Datenrahmen, die eine bestimmte Zeichenfolge in einer bestimmten Spalte enthalten?





drop delete (6)


Der folgende Code gibt Ihnen eine Liste aller Zeilen:

df[df['C'] != 'XYZ']

Um die Werte aus dem obigen Code in einem Datenrahmen zu speichern:

newdf = df[df['C'] != 'XYZ']

Ich habe einen sehr großen Datenrahmen in Python und ich möchte alle Zeilen löschen, die eine bestimmte Zeichenfolge in einer bestimmten Spalte enthalten.

Zum Beispiel möchte ich alle Zeilen löschen, die die Zeichenkette "XYZ" als Teilkette in der Spalte C des Datenrahmens haben.

Kann dies mit der .drop () Methode effizient implementiert werden?




pandas hat Zeichenfolgenoperationen vektorisiert, so dass Sie nur die Zeilen herausfiltern können, die die Zeichenfolge enthalten, die Sie nicht möchten:

In [91]: df = pd.DataFrame(dict(A=[5,3,5,6], C=["foo","bar","fooXYZbar", "bat"]))

In [92]: df
Out[92]:
   A          C
0  5        foo
1  3        bar
2  5  fooXYZbar
3  6        bat

In [93]: df[df.C.str.contains("XYZ") == False]
Out[93]:
   A    C
0  5  foo
1  3  bar
3  6  bat



Wenn die Zeichenfolgeneinschränkung nicht nur eine Zeichenfolge ist, können Sie die entsprechenden Zeilen mit folgenden Elementen löschen:

df = df[~df['your column'].isin(['list of strings'])]

Mit dem obigen Befehl werden alle Zeilen gelöscht, die Elemente Ihrer Liste enthalten




Dies funktioniert nur, wenn Sie exakte Strings vergleichen wollen. Es wird nicht funktionieren, falls Sie überprüfen möchten, ob die Spaltenzeichenfolge eine der Zeichenfolgen in der Liste enthält. Der richtige Weg, um mit einer Liste zu vergleichen, wäre:

   searchfor = ['john', 'doe']
   df = df[~df.col.str.contains('|'.join(searchfor))]



Wenn Sie nicht alle NaN löschen möchten, verwenden Sie

df[~df.C.str.contains("XYZ") == True]



Schnelle Antwort (TL; DR)

Beispiel

### example01 -------------------
mystring  =   'coup_ate_grouping'
backwards =   mystring[::-1]
print backwards

### ... or even ...
mystring  =   'coup_ate_grouping'[::-1]
print mystring

### result01 -------------------
'''
gnipuorg_eta_puoc
'''

Ausführliche Antwort

Hintergrund

Diese Antwort wird bereitgestellt, um folgende Probleme von @odigity zu beheben:

Beeindruckend. Ich war zuerst entsetzt über die Lösung, die Paolo vorgeschlagen hatte, aber das entging dem Horror, den ich beim Lesen des ersten Kommentars empfand: "Das ist sehr pythisch. Gute Arbeit!" Ich bin so beunruhigt, dass solch eine helle Gemeinschaft denkt, solche kryptischen Methoden für etwas so Grundlegendes zu verwenden, ist eine gute Idee. Warum ist es nicht nur an Reverse ()?

Problem

  • Kontext
    • Python 2.x
    • Python 3.x
  • Szenario:
    • Entwickler möchte eine Zeichenfolge transformieren
    • Die Transformation besteht darin, die Reihenfolge aller Zeichen umzukehren

Lösung

Fallstricke

  • Entwickler erwartet möglicherweise etwas wie string.reverse()
  • Die native idiomatische (aka " pythonic ") Lösung ist möglicherweise für neuere Entwickler nicht lesbar
  • Entwickler könnten versucht sein, eine eigene Version von string.reverse() zu string.reverse() , um die Slice-Notation zu vermeiden.
  • Die Ausgabe der Slice-Notation kann in einigen Fällen kontraintuitiv sein:
    • siehe zB Beispiel02
      • print 'coup_ate_grouping'[-4:] ## => 'ping'
      • verglichen mit
      • print 'coup_ate_grouping'[-4:-1] ## => 'pin'
      • verglichen mit
      • print 'coup_ate_grouping'[-1] ## => 'g'
    • Die unterschiedlichen Ergebnisse der Indexierung auf [-1] können einige Entwickler abschrecken

Begründung

Python muss besondere Umstände beachten: Eine Zeichenfolge ist ein iterable Typ.

Eine Begründung für den Ausschluss einer string.reverse() -Methode besteht darin, den Python-Entwicklern einen Anreiz zu geben, die Macht dieses besonderen Umstandes zu nutzen.

Vereinfacht ausgedrückt bedeutet dies einfach, dass jedes einzelne Zeichen in einer Zeichenfolge als Teil einer sequentiellen Anordnung von Elementen einfach bearbeitet werden kann, genau wie Arrays in anderen Programmiersprachen.

Um zu verstehen, wie dies funktioniert, kann reviewing02 einen guten Überblick geben.

Beispiel02

### example02 -------------------
## start (with positive integers)
print 'coup_ate_grouping'[0]  ## => 'c'
print 'coup_ate_grouping'[1]  ## => 'o' 
print 'coup_ate_grouping'[2]  ## => 'u' 

## start (with negative integers)
print 'coup_ate_grouping'[-1]  ## => 'g'
print 'coup_ate_grouping'[-2]  ## => 'n' 
print 'coup_ate_grouping'[-3]  ## => 'i' 

## start:end 
print 'coup_ate_grouping'[0:4]    ## => 'coup'    
print 'coup_ate_grouping'[4:8]    ## => '_ate'    
print 'coup_ate_grouping'[8:12]   ## => '_gro'    

## start:end 
print 'coup_ate_grouping'[-4:]    ## => 'ping' (counter-intuitive)
print 'coup_ate_grouping'[-4:-1]  ## => 'pin'
print 'coup_ate_grouping'[-4:-2]  ## => 'pi'
print 'coup_ate_grouping'[-4:-3]  ## => 'p'
print 'coup_ate_grouping'[-4:-4]  ## => ''
print 'coup_ate_grouping'[0:-1]   ## => 'coup_ate_groupin'
print 'coup_ate_grouping'[0:]     ## => 'coup_ate_grouping' (counter-intuitive)

## start:end:step (or start:end:stride)
print 'coup_ate_grouping'[-1::1]  ## => 'g'   
print 'coup_ate_grouping'[-1::-1] ## => 'gnipuorg_eta_puoc'

## combinations
print 'coup_ate_grouping'[-1::-1][-4:] ## => 'puoc'

Fazit

Die kognitive Belastung, die damit verbunden ist, zu verstehen, wie die Slice-Notation in Python funktioniert, mag für manche Adoptierer und Entwickler, die nicht viel Zeit in das Erlernen der Sprache investieren wollen, tatsächlich zu viel sein.

Sobald jedoch die Grundprinzipien verstanden sind, kann die Stärke dieses Ansatzes im Vergleich zu festen String-Manipulationsmethoden ziemlich günstig sein.

Für diejenigen, die anders denken, gibt es alternative Ansätze, wie Lambda-Funktionen, Iteratoren oder einfache einmalige Funktionsdeklarationen.

Falls gewünscht, kann ein Entwickler seine eigene string.reverse () -Methode implementieren, jedoch ist es gut, die Gründe für diesen Aspekt von Python zu verstehen.

Siehe auch





python pandas