计算.csv列(Python)部分中的唯一元素

时间:2013-08-13 10:13:16

标签: python csv counter

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

1 个答案:

答案 0 :(得分:0)

您需要跟踪每个地层已经看到过的化石。 collections.defaultdict() object使编码变得最简单;它保持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列;你没有在你的问题中指定如何提取化石名称。