0

我有一个 .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 文件中单个列的一部分中的唯一元素,而不是所有元素?

4

1 回答 1

0

您需要跟踪每个地层您已经看到的化石。对象使编码变得最简单collections.defaultdict()它保留了set我们可以测试的格式:

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 行直接“流”到Counter()对象中;不保留任何中间数据。

每一行都经过测试:

  • 看到编队列不为空
  • 看到给定化石的形成尚未记录
  • 记录给定化石的形成

我假设化石名称在第 0 列;您没有在问题中指定如何提取化石名称。

于 2013-08-13T10:29:09.380 回答