Textteile aus String entfehrnen im Dataframe spalte mit Bedingung

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
python_student
User
Beiträge: 23
Registriert: Samstag 22. Februar 2020, 13:02

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?
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Code: Alles auswählen

df['SPALTENNAME'].str.slice(start=0, stop=6)
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
python_student
User
Beiträge: 23
Registriert: Samstag 22. Februar 2020, 13:02

: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.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten