2015-09-23 10 views
6

Ho un file csv con 3 colonne, in cui ogni riga di Colonna 3 contiene un elenco di valori. Come si può vedere dalla seguente struttura tavoloCome leggere una colonna di csv come lista dei dtype usando i panda?

Col1,Col2,Col3 
1,a1,"['Proj1', 'Proj2']" 
2,a2,"['Proj3', 'Proj2']" 
3,a3,"['Proj4', 'Proj1']" 
4,a4,"['Proj3', 'Proj4']" 
5,a5,"['Proj5', 'Proj2']" 

Ogni volta che provo a leggere questo csv, Col3 è sempre letto come oggetto str e non come lista. Ho cercato di alterare il DTYPE di quella colonna per elencare ma ho ottenuto "Attributo di errore", come di seguito

df = pd.read_csv("inputfile.csv") 
df.Col3.dtype = list 

AttributeError       Traceback (most recent call last) 
<ipython-input-19-6f9ec76b1b30> in <module>() 
----> 1 df.Col3.dtype = list 

C:\Python27\lib\site-packages\pandas\core\generic.pyc in __setattr__(self,   name, value) 
    1953      object.__setattr__(self, name, value) 
    1954    except (AttributeError, TypeError): 
-> 1955     object.__setattr__(self, name, value) 
    1956 
    1957  #---------------------------------------------------------------------- 

AttributeError: non è possibile impostare l'attributo

Sarebbe davvero bello se mi si può guidare come andare a proposito.

+0

Puoi mostrarci un esempio del tuo csv (non come immagine), copia incolla prima alcune righe del tuo csv. –

+0

Avviso standard: i valori non scalari non sono realmente supportati dai panda. Puoi usarli, dato che a volte sono a portata di mano nei passaggi intermedi, ma lavorare con loro è scomodo e non cambierà nel prossimo futuro. – DSM

+0

Cosa vuoi fare con i valori? –

risposta

-1

Provare a rimuovere le parentesi "[" e "]" dalla colonna. Quindi utilizzare la funzione python string split per convertirla in un elenco.

df['Col3'] = df['Col3'].str.replace(']',"") 
df['Col3'] = df['Col3'].str.replace('[',"") 
df['Col3'] = df['Col3'].str.split() 
6

è possibile utilizzare il lib AST:

from ast import literal_eval 


df.Col3 = df.Col3.apply(literal_eval) 
print(df.Col3[0][0]) 
Proj1 

È anche possibile farlo quando si crea il dataframe dal CSV, utilizzando converters:

df = pd.read_csv("in.csv",converters={"Col3": literal_eval}) 

Se sei sicuro che il il formato è uguale per tutte le stringhe, lo stripping e lo splitting saranno molto più veloci:

df = pd.read_csv("in.csv",converters={"Col3": lambda x: x.strip("[]").split(", ")}) 

Ma finirai con le stringhe racchiuse tra virgolette

+0

mi sto errore di sintassi restituito quando si prova a farlo. La mia stringa è '[http://whatever.com/extension]' – bgenchel

Problemi correlati