2017-08-18 3 views
3

Ich habe diese 'file.csv' Datei mit Pandas zu lesen:Pandas - umwandeln String in der String-Liste

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

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

die Ausgabe mit 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 eine Liste von Zeichenfolgen wie ["Tag1","Tag2"] lesen. Ich habe versucht, die Lösung in this Frage, aber kein Glück gibt, da ich die [ und Zeichen, die tatsächlich die Dinge vermasseln.

sollte der erwartete Ausgang sein:

In [64]: df['Tags'][0][0] 
Out[64]: 'Tag1' 
+1

Ich habe eine ähnliche Frage gestellt, Sie können die Antworten hier sehen: https://stackoverflow.com/questions/44529483/python-convert-string-list-to-list – Ahmed

Antwort

1

Sie können die Zeichenfolge manuell aufgeteilt:

>>> df['Tags'] = df.Tags.apply(lambda x: x[1:-1].split(',')) 
>>> df.Tags[0] 
['Tag1', 'Tag2'] 
+3

Oder wenden Sie es auf Last .. .'df = pd.read_csv ('Datei.csv', sep = '|', Konverter = {'Tags': Lambda x: x [1: -1] .split (',')}) ' –

+0

@ JonClements Guter Punkt. –

0

glaube ich Ihnen das json-Modul nutzen könnten.

import json 
import pandas 

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

So wird dies Ihren Datenrahmen nach wie vor laden, dann eine Lambda-Funktion zu jedem der Elemente in der Tags Spalte anwenden. Die Lambda-Funktion ruft json.loads() auf, die die Zeichenfolgendarstellung der Liste in eine tatsächliche Liste konvertiert.

3

Sie können die Zeichenfolge in eine Liste konvertieren, indem Sie strip und split verwenden.

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

df_out.Tags[0][0] 

Ausgang:

'Tag1' 
2

Oder

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

Ihre df['Tags'] erscheint eine Liste von Strings zu sein. Wenn Sie diese Liste drucken, sollten Sie ["[tag1,tag2]","[Tag1,Tag2,Tag3]","[Tag3,Tag1]"] erhalten, deshalb erhalten Sie, wenn Sie das erste Element des ersten Elements aufrufen, tatsächlich das erste einzelne Zeichen der Zeichenfolge und nicht das, was Sie wollen.

Sie müssen diese Zeichenfolge entweder analysieren. Darstellende so etwas wie

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

Aber wie Sie in Ihrem zitiertes Beispiel sah dies wird Ihnen eine Liste, die wie

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

sieht Was Sie brauchen, ist ein Weg, um die Zeichenfolge Bearbeitung aus mehreren Zeichen zu analysieren. Sie können dazu einen einfachen Regex-Ausdruck verwenden.Etwas wie:

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

gedruckt wird:

'tag1' 

Mit der andere Antwort beteiligt Pandas Konverter, die Sie vielleicht einen Konverter wie folgt schreiben:

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

Wenn Sie nicht wissen, regex, Sie können ziemlich mächtig sein, aber auch unvorhersehbar, wenn Sie sich nicht sicher sind, was Sie mit den Eingabestrings anfangen sollen. Der hier verwendete Ausdruck r"[\w']+" stimmt mit jedem gebräuchlichen Wort alphanumerisch und Unterstrichen überein und behandelt alles andere als Punkt für re.findall, um die Liste aufzuteilen.