繁体   English   中英

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

[英]Counting unique elements in sections of .csv columns (Python)

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

您需要跟踪每个地层已经看到的化石。 一个collections.defaultdict()对象使编码变得最容易。 它为我们可以测试的每个编队set了一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列中; 您没有在问题中指定如何提取化石名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM