13 Stimmen

Wie erstellt man in Python eine Liste mit den eindeutigen Werten einer CSV-Datei?

Ich habe eine CSV-Datei, die wie folgt aussieht,

1994, Kategorie1, Etwas ist passiert 1
1994, Kategorie2, Etwas ist passiert 2
1995, Kategorie1, Etwas ist passiert 3
1996, Kategorie3, Etwas ist passiert 4
1998, Kategorie2, Etwas ist passiert 5

Ich möchte zwei Listen erstellen,

Kategorie = [Kategorie1, Kategorie2, Kategorie3]

und

Jahr = [1994, 1995, 1996, 1998]

Ich möchte die Duplikate in der Spalte auslassen. Ich lese die Datei wie folgt ein,

DatenErfasst = csv.reader(DatenDatei, delimiter=',')  
DatenErfasst.next()

und durchlaufe sie,

   for Spalte in DatenErfasst:

13voto

dawg Punkte 89931

Sie können folgendes tun:

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

Wie in den Kommentaren erwähnt, wenn die Reihenfolge keine Rolle spielt, wäre die Verwendung eines Sets einfacher und schneller:

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

7voto

CT Zhu Punkte 48823

Ein sehr prägnanter Weg, dies zu tun, ist die Verwendung von pandas, die Vorteile sind: es hat einen schnelleren CSV-Pharser; und es funktioniert in Spalten (so dass nur ein df.apply(set) erforderlich ist, um dorthin zu gelangen) :

In [244]:
#Angenommen, die CSV-Datei heißt 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 Happened...
dtype: object

Der Nachteil ist, dass es eine pandas.Series zurückgibt und um auf jede Liste zuzugreifen, müssen Sie etwas wie list(df.apply(set)[0]) tun.

Bearbeiten

Wenn die Reihenfolge beibehalten werden muss, kann dies auch sehr einfach gemacht werden, zum Beispiel:

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

item.unique() wird numpy.arrays zurückgeben, anstatt lists.

2voto

rob_7cc Punkte 626

dawg wies darauf hin, dass einer der besten Tricks in Python besteht darin, set() zu verwenden, um Duplikate aus einer Liste zu entfernen. dawg zeigt, wie man die eindeutige Liste von Grund auf aufbaut, indem man jedes Element zu einem set hinzufügt, was perfekt ist. Aber hier ist eine weitere äquivalente Möglichkeit, dies zu tun, indem man eine Liste mit Duplikaten und eine Liste ohne Duplikate mithilfe eines list(set())-Ansatzes generiert:

import csv

in_str = [
    'Jahr, Kategorie, Ereignis',
    '1994, Kategorie1, Etwas ist passiert 1',
    '1994, Kategorie2, Etwas ist passiert 2',
    '1995, Kategorie1, Etwas ist passiert 3',
    '1996, Kategorie3, Etwas ist passiert 4',
    '1998, Kategorie2, Etwas ist passiert 5'
    ]

cdr = csv.DictReader(in_str, skipinitialspace=True)

col = []
for i in cdr:
    col.append(i['Kategorie'])

# alle Elemente in der Spalte...
print(col)
# nur eindeutige Elemente in der Spalte...
print(list(set(col)))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X