我有一个.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)
您需要跟踪每个地层已经看到过的化石。 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列;你没有在你的问题中指定如何提取化石名称。