2016-09-29 4 views
0

ich eine Pandas df eine Säule, bestehend aus Text wie enthalten:Parse Pandas df Spalte mit regex Extrahieren Teil

String1::some_text::some_text;String2::some_text::;String3::some_text::some_text;String4::some_text::some_text 

kann ich sehen:

  1. Der Anfang des Textes enthält immer die erste Zeichenfolge, die ich extrahieren möchte
  2. Der Rest der Zeichenfolgen sind zwischen "::" und ";"

Ich möchte eine neue Spalte erstellen enthält:

String1, String2, String3, String4 

Alle separed durch ein Komma, aber immer noch in der gleichen Spalte.

Wie wird das Problem behandelt?

Danke für Ihre Hilfe

Antwort

0

Ich würde nur eine Lambda-Funktion anwenden, die Operation, die Sie tun möchten, zu tun (Split zuerst auf " ; ", dann spalte auf" :: "und behalte das erste Element und verbinde sie zurück):

df['new_col'] = df['old_col'].apply(lambda s: ", ".join(t.split("::")[0] for t in s.split(";"))) 

Sie auch Splitting auf :: vermeiden können, da einfach vor den ersten : stoppen ist genug:

df['new_col'] = df['old_col'].apply(lambda s: ", ".join(t[:t.index(":")] for t in s.split(";"))) 
1

try this:

In [136]: df.txt.str.findall(r'String\d+').str.join(', ') 
Out[136]: 
0 String1, String2, String3, String4 
Name: txt, dtype: object 

Daten:

In [137]: df 
Out[137]: 
                            txt 
0 String1::some_text::some_text;String2::some_text::;String3::some_text::some_text;String4::some_t... 

Setup:

df = pd.DataFrame({'txt': ['String1::some_text::some_text;String2::some_text::;String3::some_text::some_text;String4::some_text::some_text']}) 
+0

Ich habe tatsächlich die dtype der Säule und es ist „Objekt“. Ich kann es nicht verschlüsseln, weil es sagt .. "UnicodeEncodeError: 'ascii' Codec kann das Zeichen u '\ xae' nicht an Position 1679 codieren: Ordnungszahl nicht im Bereich (128)" wenn ich versuche: df.column. astyp (str). – xxxvinxxx

0

betrachten die Datenrahmen df mit Spalte txt

df = pd.DataFrame(['String1::some_text::some_text;String2::some_text::;String3::some_text::some_text;String4::some_text::some_text'] * 10, 
        columns=['txt']) 
df 

enter image description here


verwenden eine Kombination aus str.split und groupby

df.txt.str.split(';', expand=True).stack() \ 
     .str.split('::').str[0].groupby(level=0).apply(list) 

0 [String1, String2, String3, String4] 
1 [String1, String2, String3, String4] 
2 [String1, String2, String3, String4] 
3 [String1, String2, String3, String4] 
4 [String1, String2, String3, String4] 
5 [String1, String2, String3, String4] 
6 [String1, String2, String3, String4] 
7 [String1, String2, String3, String4] 
8 [String1, String2, String3, String4] 
9 [String1, String2, String3, String4] 
dtype: object 
+0

es funktioniert. aber ich verstehe nicht, warum es die Listenmethode anwendet. Wie kann ich es als eine einfache neue Spalte im vorherigen Datenrahmen behalten? – xxxvinxxx

+0

@xxxvinxxx Die Listenfunktion verwandelt ein iterables in eine Liste. Weisen Sie dies einer Datenrahmenspalte zu und Sie haben, was Sie wollen. – piRSquared