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?
Textteile aus String entfehrnen im Dataframe spalte mit Bedingung
Code: Alles auswählen
df['SPALTENNAME'].str.slice(start=0, stop=6)
- __blackjack__
- User
- Beiträge: 13925
- 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
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
-
- User
- Beiträge: 23
- Registriert: Samstag 22. Februar 2020, 13:02

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.
- __blackjack__
- User
- Beiträge: 13925
- 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.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
- __blackjack__
- User
- Beiträge: 13925
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@python_studend: Bis zum zweiten "_" könnte man das so machen:
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.
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
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware