2013-10-13 2 views
10

Ho un dataframe panda come il seguente:Colonna con lista di stringhe in Python

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

Da questo dataframe, vorrei estrarre solo le righe in cui la lista nella colonna di quella riga 'categorie' contiene la categoria "Ristoranti". Ho provato fino ad ora: df[[df.categories.isin('Restaurants'),review_count]],

come ho anche altre colonne nel dataFrame, ho specificato queste due colonne che voglio estrarre. Ma ho ricevuto l'errore:

TypeError: unhashable type: 'list' 

Non ho molta idea di cosa significhi questo errore poiché sono molto nuovo per i panda. Per favore fatemi sapere come posso raggiungere il mio obiettivo di estrarre solo quelle righe dal dataFrame in cui la colonna 'categorie' per quella riga ha la stringa 'Ristoranti' come parte della categorylist. Qualsiasi aiuto sarebbe molto apprezzato.

Grazie in anticipo!

+1

l'errore "tipo dell'hash" normalmente che il tipo, lista in questo caso, è mutevole. I tipi mutabili non sono lavabili, perché possono cambiare dopo aver prodotto il codice hash.Ciò accade perché si sta tentando di recuperare un elemento utilizzando un elenco come chiave, ma poiché una chiave deve essere lavabile, il recupero non riesce. –

risposta

9

penso che si potrebbe essere necessario utilizzare una funzione lambda per questo, dal momento che è possibile verificare se un valore nella colonna isin qualche sequenza, ma pandas non sembra fornire una funzione per testare se la sequenza nella vostra colonna contiene qualche valore:

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)] 

uscita:

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

Penso che in pandas0.12 si possono fare cose come:

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

documenti a pandas.DataFrame.query

+0

Come oggi, questo fornisce 'TypeError: tipo non cancellabile: errore 'list''. – Zero

3

Ok, così ho cercato di capire una risposta a questo per un bel po 'di tempo , ma sono usciti vuoti (senza praticamente scrivere un piccolo programma ricorsivo per espandere la lista) e penso che sia perché, a prima vista, comunque, quello che stai cercando di fare non è poi così efficiente (il commento di Jimmy C sugli elenchi essere mutevoli è qui su questo punto) e non è il modo in cui lo faresti per la maggior parte del tempo in Panda.

una migliore e (credo) modo più veloce potrebbe essere quella di memorizzare la lista annidata come valori di colonna in modo che si avrebbe:

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 

Ovviamente, questo comporterebbe scrivere un programma Python per tirare fuori il tuo categorie dagli elenchi nidificati e quindi esportarli in un DataFrame, ma questo colpo una tantum (per i dati esistenti) potrebbe essere utile per ciò che si ottiene usando i panda per analizzare il dataframe risultante.

C'è una sezione in Python per l'analisi dei dati di Wes chiamata "Indicatore di calcolo/variabili fittizie" (circa 330 circa) che sarebbe una buona risorsa per questo tipo di operazione.

Scusa, non risponde alla tua domanda, e certamente non so quanto sia fattibile, ma in caso contrario, puoi provare la soluzione di rtrwalker, che sembra abbastanza buona, ma è il ramo di sviluppo, solo FYI.