web-dev-qa-db-de.com

pandas - konvertieren Sie String in eine Liste von Strings

Ich habe diese Datei 'file.csv', die ich mit Pandas lesen kann:

Title|Tags
T1|"[Tag1,Tag2]"
T1|"[Tag1,Tag2,Tag3]"
T2|"[Tag3,Tag1]"

mit

df = pd.read_csv('file.csv', sep='|')

die Ausgabe ist:

  Title              Tags
0    T1       [Tag1,Tag2]
1    T1  [Tag1,Tag2,Tag3]
2    T2       [Tag3,Tag1]

Ich weiß, dass die Spalte Tags eine vollständige Zeichenfolge ist, da:

In [64]: df['Tags'][0][0]
Out[64]: '['

Ich muss es als Liste von Strings wie ["Tag1","Tag2"] lesen. Ich habe die Lösung aus this question ausprobiert, aber kein Glück dabei, da ich die [- und ]-Zeichen habe, die die Dinge tatsächlich durcheinanderbringen.

Die erwartete Ausgabe sollte lauten:

In [64]: df['Tags'][0][0]
Out[64]: 'Tag1'
5
Fabio Lamanna

Sie können die Zeichenfolge manuell teilen:

>>> df['Tags'] = df.Tags.apply(lambda x: x[1:-1].split(','))
>>> df.Tags[0]
['Tag1', 'Tag2']
4
Mike Müller

Oder 

df.Tags=df.Tags.str[1:-1].str.split(',').tolist()
3
Wen-Ben

Sie können den String mit strip und split in eine Liste konvertieren.

df_out = df.assign(Tags=df.Tags.str.strip('[]').str.split(','))

df_out.Tags[0][0]

Ausgabe:

'Tag1'
3
Scott Boston

Ihr df['Tags'] scheint eine Liste von Strings zu sein. Wenn Sie diese Liste ausdrucken, sollten Sie ["[tag1,tag2]","[Tag1,Tag2,Tag3]","[Tag3,Tag1]"] erhalten. Wenn Sie also das erste Element des ersten Elements aufrufen, erhalten Sie tatsächlich das erste einzelne Zeichen der Zeichenfolge und nicht das gewünschte Zeichen.

Sie müssen diese Zeichenfolge anschließend analysieren. So etwas durchführen

df['Tags'][0] = df['Tags'][0].split(',')

Aber wie Sie in Ihrem zitierten Beispiel gesehen haben, erhalten Sie eine Liste, die aussieht 

in: df['Tags'][0][0] 
out: '[tag1'`

Was Sie brauchen, ist eine Möglichkeit, die Zeichenfolge zu analysieren, wenn Sie mehrere Zeichen bearbeiten. Sie können dazu einen einfachen Regex-Ausdruck verwenden. So etwas wie:

 import re
 df['Tags'][0] = re.findall(r"[\w']+", df['Tags'][0])
 print(df['Tags'][0][0])

wird drucken:

 'tag1'

Wenn Sie die andere Antwort mit Pandas-Konvertern verwenden, können Sie einen Konverter folgendermaßen schreiben:

 def clean(seq_string):
      return re.findall(r"[\w']+", seq_string)

Wenn Sie Regex nicht kennen, können sie recht mächtig sein, aber auch unvorhersehbar, wenn Sie sich nicht sicher sind, welchen Inhalt Ihre Eingabestrings haben. Der hier verwendete Ausdruck r"[\w']+" passt zu allen gängigen alphanumerischen Word-Zeichen und Unterstrichen und behandelt alles andere als einen Punkt, an dem re.findall die Liste aufteilt.

1
Veggiet

Ich denke, Sie könnten das Json-Modul verwenden.

import json
import pandas

df = pd.read_csv('file.csv', sep='|')
df['Tags'] = df['Tags'].apply(lambda x: json.loads(x))

Dadurch wird Ihr Datenframe wie zuvor geladen und anschließend auf jedes Element in der Spalte Tags eine Lambda-Funktion angewendet. Die Lambda-Funktion ruft json.loads() auf, wodurch die Darstellung der Liste in eine tatsächliche Liste umgewandelt wird.

0
RHSmith159