2013-08-13 3 views
0

각 형성에서 지층과 화석 종의 출현에 대한 .csv 파일이 있습니다. 각 화석은 그 행에 포메이션 이름이 포함 된 .csv 파일에 자체 행이 있습니다..csv 열의 섹션에서 고유 한 요소 계산 (파이썬)

아래에서 작성한 코드는 형성 횟수를 잘 보여줍니다.

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

당신은 형성 과정에서 이미 본 화석을 추적해야합니다. collections.defaultdict() object은 코딩을 가장 쉽게 만듭니다. 그것은 형성 당 set 우리가에 대해 테스트 할 수 있습니다 유지 : 바로 Counter() 객체로 하나의 발전기 식

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 

위의 코드 '스트림'당신 CSV 행; 중간 데이터는 보관되지 않습니다. 에

각 행은 테스트 :

  • 가 형성이 아직 주어진 화석
  • 레코드에 기록되지 않은 것을 볼 형성 열이 비어 있지 않은 것을 볼 주어진 화석
  • 의 형성

화석 이름이 0 열에 있다고 가정했습니다. 당신은 질문에서 화석 이름을 추출하는 방법을 명시하지 않았습니다.

관련 문제