2014-06-26 6 views
6

Ho file CSV che sia simile alla seguente,Come creare un elenco in Python con i valori univoci di un file CSV?

1994, Category1, Something Happened 1 
1994, Category2, Something Happened 2 
1995, Category1, Something Happened 3 
1996, Category3, Something Happened 4 
1998, Category2, Something Happened 5 

voglio creare due liste,

Category = [Category1, Category2, Category3] 

e

Year = [1994, 1995, 1996, 1998] 

voglio omettere i duplicati nella colonna . Sto leggendo il file come segue,

DataCaptured = csv.reader(DataFile, delimiter=',') 
DataCaptured.next() 

e Looping attraverso,

for Column in DataCaptured: 
+1

Esiste una relazione tra 'Categoria' e' Anno'? – dawg

+0

@dawg No. Non sono correlati. Sono solo eventi casuali accaduti in quell'anno. –

risposta

7

si può fare:

DataCaptured = csv.reader(DataFile, delimiter=',', skipinitialspace=True) 

Category, Year = [], [] 
for row in DataCaptured: 
    if row[0] not in Year: 
     Year.append(row[0]) 
    if row[1] not in Category: 
     Category.append(row[1])  

print Category, Year   
# ['Category1', 'Category2', 'Category3'] ['1994', '1995', '1996', '1998'] 

Come indicato nei commenti, se l'ordine non lo fa importa, usare un set sarebbe più facile e veloce:

Category, Year = set(), set() 
for row in DataCaptured: 
    Year.add(row[0]) 
    Category.add(row[1]) 
+0

se l'ordine non ha importanza, probabilmente è più facile fare 'Category, Year = set(), set()' e usare 'per riga in DataCaptured: Year.add (row [0]); Category.add (row [1]) ' –

+2

Concordato. Ho pensato che l'ordine fosse importante, quindi ho usato un elenco ... – dawg

+0

@AdamSmith ha funzionato molto bene. –

4

Un modo molto conciso per fare questo è utilizzare pandas, i vantaggi sono: ha un pharser CSV più veloce; e funziona in colonne (in modo che richiede solo una df.apply(set) per arrivare lì):

In [244]: 
#Suppose the CSV is named temp.csv 
df=pd.read_csv('temp.csv',header=None) 
df.apply(set) 
Out[244]: 
0      set([1994, 1995, 1996, 1998]) 
1   set([ Category2, Category3, Category1]) 
2 set([ Something Happened 4, Something Happene... 
dtype: object 

Il rovescio della medaglia è che si restituisce un pandas.Series, e per ottenere l'accesso a ciascuna lista, è necessario fare qualcosa di simile list(df.apply(set)[0]).

Modifica

Se l'ordine deve essere conservato, può essere anche fatto molto facilmente, ad esempio:

for i, item in df.iteritems(): 
    print item.unique() 

item.unique() tornerà numpy.array s, invece di list s.