Seite 1 von 1

Textteile aus String entfehrnen im Dataframe spalte mit Bedingung

Verfasst: Donnerstag 27. Februar 2020, 10:32
von python_student
Hallo Leute,
Ich möchte aus mehreren strings in meiner Dataframe Spalte einen Teil entfernen.
die strings schauen folgendermassen aus:

abc_QM_asdf_123
abc_QM_asdf_Task
abc_QM_qwertz_2222_yxcv
abc
abc_S

nach der Bearbeitung soll das ganze so aussehen:

abc_QM
abc_QM
abc_QM
abc
abc_S

Wie man sieht müsste ich erst vor dem zweiten Unterstrich den restlichen string löschen.
Mit den 'strip' Methoden komme ich da nicht weiter. Entweder bleibt zu viel stehen oder es wird zu viel entfernt.
Ein Ansatz wäre, dass ich die Spalte in eine Liste setze und durch jedes Element durch iteriere und sobald ein zweiter Unterstrich kommt den restlichen string lösche. Leider ist dieser Ansatz sehr aufwendig.
Gibt es da vielleicht eine andere Methode?

Re: Textteile aus String entfehrnen im Dataframe spalte mit Bedingung

Verfasst: Donnerstag 27. Februar 2020, 10:53
von Jankie

Code: Alles auswählen

df['SPALTENNAME'].str.slice(start=0, stop=6)

Re: Textteile aus String entfehrnen im Dataframe spalte mit Bedingung

Verfasst: Donnerstag 27. Februar 2020, 10:54
von __blackjack__
Versuch mit regulärem Ausdruck:

Code: Alles auswählen

In [29]: df                                                                     
Out[29]: 
                         0
0          abc_QM_asdf_123
1         abc_QM_asdf_Task
2  abc_QM_qwertz_2222_yxcv
3                      abc
4                    abc_S

In [30]: df[0].str.extract("(.+?(?:_[^_]+)|.*)")                               
Out[30]: 
        0
0  abc_QM
1  abc_QM
2  abc_QM
3     abc
4   abc_S

Re: Textteile aus String entfehrnen im Dataframe spalte mit Bedingung

Verfasst: Donnerstag 27. Februar 2020, 11:54
von python_student
:o
Ich bin begeistert __blackjack__
Ich müsste dir mein Gehalt als Werkstudent überweisen. Vielen Dank.
Ich verstehe es noch nicht auch nicht wenn ich recherchiere.
Ich versuche es mal hier aufzuschreiben wie ich es verstehe:
Die innere Klammer:
(?:_[^_]+)
Extrahiert alles bis der zweite Unterstrich kommt. Warum dann das Hochstellungszeichen und die eckigen klammern?
Die äussere Klammer:
(.+?(....)|.*)
puh was soll ich da sagen. Hat der Strich die Bedeutung: Oder (Disjunktion). Das ist mir zu hoch. Ich wäre dankbar um eine Erklärung
Hab versucht auch ein paar Sachen zu verändern, für mich passieren dann undefinierte Sachen.
Um es vielleicht an einem Beispiel zu verstehen. Wie müsste ich den regulären Ausdruck verändern wenn ich den zweiten Unterstrich noch behalten will, also erst ab dem zweiten Unterstrich löschen möchte.
Vielen Dank schon mal im voraus.

Re: Textteile aus String entfehrnen im Dataframe spalte mit Bedingung

Verfasst: Donnerstag 27. Februar 2020, 12:21
von __blackjack__
@python_student: In der Python-Dokumentation wird die Syntax von regulären Ausdrücken erklärt und dort gibt es auch ein HOWTO. Ansonsten helfen Werkzeuge wie http://regex101.com/ beim Entwickeln und Erklären ganz gut.

Re: Textteile aus String entfehrnen im Dataframe spalte mit Bedingung

Verfasst: Donnerstag 27. Februar 2020, 12:27
von __blackjack__
@python_studend: Bis zum zweiten "_" könnte man das so machen:

Code: Alles auswählen

In [50]: df[0].str.extract("([^_]+_[^_]+(?:_[^_]+)|.*)")                        
Out[50]: 
               0
0    abc_QM_asdf
1    abc_QM_asdf
2  abc_QM_qwertz
3            abc
4          abc_S
Da erreicht man dann aber IMHO auch eine Grenze mit der das sinnvoll ist, denn reguläre Ausdrücke können nicht ”zählen”, das heisst man muss hier jetzt anfangen Teilausdrücke zu wiederholen.