Dieser Ansatz funktioniert:
import pandas as pd
import ast
test = {'Description':["['boy']","['boy', 'jumped', 'roof']","['paris']",\
"['paris', 'beautiful', 'new', 'york']","['lets', 'go', 'party']",\
"['refused', 'come', 'party']"]}
tt = pd.DataFrame(test)
listOfWords = []
for i,row in tt.iterrows():
listOfWords.extend(ast.literal_eval(tt.ix[i,'Description']))
uniqueWords = pd.DataFrame(listOfWords,columns=['Unique Words']).drop_duplicates()
Wenn Sie es sortiert haben möchten:
uniqueWords = uniqueWords.sort_values('Unique Words')
Sie durchlaufen alle Zeilen, konvertieren Ihre Strings in Listen und sammeln alle diese Listen in einer langen Liste mit extend
. Dann erstellen Sie einfach einen neuen Datenrahmen aus dieser Liste und legen Sie die Duplikate ab.
EDIT: Dank Jezrael für die Korrektur meiner Lösung, ich borgte die ast.literal_eval
Ansatz von seiner Lösung.
Ich habe versucht, unsere Lösungen mit dem %timeit
Befehl zu vergleichen, aber ValueError: malformed string
auf ast.literal_eval
in beiden Lösungen.
EDIT2: Jezrael Lösung ist doppelt so schnell für die kleinen Daten Beispiel wir hier haben.
EDIT3: Ich kann nicht mit einem großen Datenbeispiel testen (multiplizieren Sie das gegebene mit einer Nummer), weil timeit
malformed string
Fehler aus Gründen wirft, die für mich unklar sind.
EDIT4: Hat es irgendwie funktioniert. Für einen größeren Datensatz (6000 Zeilen) ist die Lösung von Jezrael über 8-mal schneller. Raten sogar mit iterrows
iterieren ist eher langsam im Vergleich zu Liste Verständnis. Auch habe ich jezraels zweite Lösung ohne ast
getestet. Es ist mehr als doppelt so schnell wie seine erste Lösung.
Ich würde vermuten, dass die Spalte Ihres Dataframes entweder Listen enthält, deren Elemente diese Wörter sind oder dass sie diese Listen im Zeichenfolgenformat enthält, also eine lange Zeichenfolge mit allen Wörtern pro Zeile. So oder so würde es die "eindeutige" Operation auf diesen Listen/vollständigen Strings statt der einzelnen Strings tun. – Khris