2015-09-23 15 views
6

Mam plik csv z 3 kolumnami, w którym każdy wiersz kolumna 3 ma listę wartości w nim. Jak widać z następującej struktury tabeliJak odczytać kolumnę csv jako listę dtype za pomocą pand?

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

Ilekroć próbuję przeczytać tę CSV Col3 jest coraz odczytywane jako str obiektu, a nie jako listy. Próbowałem zmieniać dtype tej kolumny do listy, ale dostał „Atrybut Error”, jak poniżej

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: nie można ustawić atrybut

Byłoby naprawdę wspaniale, gdyby można kierować mi jak przejść o tym.

+0

Możesz pokazać nam przykład twojego csv (nie jako obrazu), skopiuj wklej kilka pierwszych wierszy twojego CSV. –

+0

Standardowe ostrzeżenie: wartości niesubstancji nie są obsługiwane przez pandy. Możesz ich używać, ponieważ czasami są przydatne w pośrednich etapach, ale praca z nimi jest niewygodna i to się nie zmieni w najbliższej przyszłości. – DSM

+0

Co chcesz zrobić z wartościami? –

Odpowiedz

-1

Spróbuj usunąć nawiasy "[" i "]" z kolumny. Następnie użyj funkcji python string split, aby przekształcić ją w listę.

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

Można użyć lib AST:

from ast import literal_eval 


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

Można też zrobić to podczas tworzenia dataframe z pliku CSV, używając converters:

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

Jeżeli jesteś pewien, że format jest taki sam dla wszystkich napisów, odrywanie i dzielenie będzie dużo szybsze:

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

Ale skończysz z ciągami owiniętymi w cudzysłów

+0

Dostaję błąd składni zwracany podczas próby wykonania tego. Mój ciąg to "[http://whatever.com/extension]" – bgenchel

Powiązane problemy