2013-10-13 13 views
10

Ich habe einen Pandas Datenrahmen wie folgt aus:Spalte mit Liste von Strings in Python

          categories review_count 
0     [Burgers, Fast Food, Restaurants]   137 
1       [Steakhouses, Restaurants]   176 
2 [Food, Coffee & Tea, American (New), Restaurants]   390 
...           ....    ... 
...           ....    ... 
...           ....    ... 

Von diesem Datenrahmen, würde ich nur die Zeilen extrahieren möge, wobei die Liste in der Spalte ‚Kategorien‘ diese Reihe enthält die Kategorie 'Restaurants'. Ich habe bis jetzt versucht: df[[df.categories.isin('Restaurants'),review_count]],

wie ich auch andere Spalten im datFrame habe, spezifizierte ich diese zwei Spalten, die ich extrahieren möchte. Aber ich bekomme den Fehler:

Ich habe nicht viel Ahnung, was dieser Fehler bedeutet, da ich sehr neu zu Pandas bin. Bitte lassen Sie mich wissen, wie ich mein Ziel erreichen kann, nur diese Zeilen aus dem datFrame zu extrahieren, wobei die Spalte "categories" für diese Zeile die Zeichenfolge "Restaurants" als Teil der categories_list enthält. Jede Hilfe würde sehr geschätzt werden.

Vielen Dank im Voraus!

+1

die "unhashable Typ" Fehler bedeuten in der Regel, dass die Art, die Liste in diesem Fall wandelbar ist. Veränderliche Typen sind nicht hashbar, da sie sich ändern können, nachdem sie den Hash-Code erzeugt haben.Dies geschieht, weil Sie versuchen, ein Element mithilfe einer Liste als Schlüssel abzurufen. Da ein Schlüssel jedoch jedoch hashfähig sein muss, schlägt der Abruf fehl. –

Antwort

9

Ich glaube, Sie müssen eine lambda Funktion dafür verwenden, da Sie, ob ein Wert in der Spalte isin einige Sequenzen testen können, aber pandas scheint nicht eine Funktion zum Prüfen, ob die Sequenz in der Spalte zu schaffen enthält einige Werte:

import pandas as pd 
categories = [['fast_food', 'restaurant'], ['coffee', 'cafe'], ['burger', 'restaurant']] 
counts = [137, 176, 390] 
df = pd.DataFrame({'categories': categories, 'review_count': counts}) 
# Show which rows contain 'restaurant' 
df.categories.map(lambda x: 'restaurant' in x) 
# Subset the dataframe using this: 
df[df.categories.map(lambda x: 'restaurant' in x)] 

Ausgang:

Out[11]: 
       categories review_count 
0 [fast_food, restaurant]   137 
2  [burger, restaurant]   390 
2

denke ich in pandas0.12 können Sie tun Dinge wie:

df.query('"Restaurants" in categories') 

docs bei pandas.DataFrame.query

+0

Wie heute, gibt dies 'TypeError: unshashable type: 'list'-Fehler. – Zero

3

Ok, also habe ich versucht worden, nun eine Antwort auf diese für eine ganze Weile, um herauszufinden, , aber sind leer ausgegangen (ohne im Grunde ein kleines rekursives Programm zu schreiben, um die Liste zu erweitern), und ich denke, weil, auf den ersten Blick sowieso, was Sie versuchen, ist nicht wirklich so effizient (Jimmy C's Kommentar zu den Listen veränderbar zu sein, ist ein Punkt hier) und ist nicht die Art, wie du dies die meiste Zeit in Pandas machen würdest.

Eine bessere und (glaube ich) schneller Weg, um Ihre verschachtelte Liste als Spaltenwerte zu speichern wäre, so dass Sie würde:

df 
    review_count Burgers Fast Food Restaurants Steakhouses Food CoffeeTea American (New) 
0   137 True  True  True   False  False False  False 
1   176 False  False  True   True   False False  False 
2   390 False  False  True   False  True True  True 

Offensichtlich ist dies würde bedeuten, ein Python-Programm zu schreiben Ihre ziehen Kategorien aus ihren verschachtelten Listen und exportieren Sie diese dann zu einem DataFrame, aber dieser einmalige Treffer (für die vorhandenen Daten) könnte sich lohnen für das, was Sie bei der Verwendung von Pandas zur Analyse des resultierenden Datenrahmens gewinnen.

Es gibt einen Abschnitt in Wes 'Buch Python für Datenanalyse namens "Computing Indicator/Dummy-Variablen" (um S. 330 oder so), die eine gute Ressource für diese Art von Operation wäre.

Sorry, das beantwortet deine Frage nicht wirklich, und ich weiß natürlich nicht, wie machbar es ist, aber ansonsten kannst du rtrwalker's Lösung ausprobieren, die ziemlich gut aussieht, aber es ist der Entwicklungszweig, nur FYI.

Verwandte Themen