2013-08-13 2 views
0

У меня есть файл CSV геологических образований и появления ископаемых видов в каждой формации. Каждая окаменелость имеет свою собственную строку в CSV-файле с именем плагина, включенным в эту строку.Подсчет уникальных элементов в сечениях столбцов .csv (Python)

Код, который я написал ниже, распечатывал количество образований в виде штрафа.

import csv 
from collections import Counter 

out=open("BivalviaGRDWIS.csv", "rb") 
data=csv.reader(out) 
data.next() 
data=[row for row in data] 
out.close() 

formations = [] 

for row in data: 
    if row[13]=='': 
     continue 
    else:  
     formations.append(row[13]) 

print Counter(formations) 

Однако могут быть дубликаты ископаемых имен, которые разрушат счет; Мне нужно только количество уникальных окаменелостей в каждой формации. Что я могу добавить для подсчета уникальных элементов в одном столбце из файла .csv, а не во всех элементах?

+0

В каком столбце указано место? –

+0

По месту, я имею в виду образование. Формирование проводится в 14-й колонке. – EJMC

+0

Вы делаете много избыточной работы в своем коде, кстати. Почему бы не цитировать ** напрямую ** над объектом 'csv.reader()'? Вместо этого вы сначала создаете список строк (кругом). –

ответ

0

Вам необходимо отслеживать, какие окаменелости вы уже видели, за образование. A collections.defaultdict() object делает кодирование самым простым; он держит set за формирование мы можем проверить на: ваши строки CSV

import csv 
from collections import Counter, defaultdict 

FOSSIL = 0 # fossil name is the first column (?) 
FORM = 13 # formation is the 14th column 

with open("BivalviaGRDWIS.csv", "rb") as inputfile: 
    data = csv.reader(inputfile) 
    next(data) # skip header 

    seen = defaultdict(set) 

    counts = Counter(
     row[FORM] 
     for row in data 
     if row[FORM] and row[FORM] not in seen[row[FOSSIL]] and not seen[row[FOSSIL]].add(row[FORM]) 
    ) 

print counts 

Приведенный выше код «потоков» в одном выражении генератора прямо в Counter() объекта; промежуточные данные не сохраняются.

Каждая строка проверяется на:

  • видеть, что колонна образования не является пустым
  • видеть, что образование было еще не записано для данного ископаемого
  • рекорда образования для данного ископаемого

Я предположил, что ископаемое имя находится в столбце 0; вы не указали, как извлечь ископаемое имя в свой вопрос.

Смежные вопросы