此计数器代码对单元格进行两次计数

问题描述 投票:0回答:3

我使用此代码来打印非数字单元格的出现次数。然而,这个数字却翻倍了。它打印 6 for 3。

样本数据:

pID,sID,dID,nID,ID
ABCD-02-01,ABCD-02-01-0002-UNK,2,123,ABCD
ABCD-02-01,ABCD-02-01-0004-UNK,3,1234,ABCD
ABCD-02-01,ABCD-02-01-0007-UNK,7,3455,ABCD

代码:

#!/usr/bin/env python
from collections import Counter, defaultdict
import csv

header_counter = defaultdict(Counter)

with open('trial.csv') as input_file:
    r = csv.reader(input_file, delimiter=',')
    headers = next(r)
    for row in r:
        row_val = sum([w.isdigit() for w in row])
        for header, val in zip(headers, row):
            if not any(map(str.isdigit, val)):
                header_counter[header].update({val: row_val})

for k, v in header_counter.iteritems():
    print k,v

电流输出

ID Counter({'ABCD': 6})
期望的输出
ID Counter({'ABCD': 3})

python csv counter defaultdict
3个回答
4
投票

所以:

11

sum([w.isdigit() for w in row])

返回每行中数字的列数,在您的情况下为两列,cols

dID
ans
nID
是数字。

因此,对于触发此操作的所有行,

row_val
都是整数 2。

14

header_counter[header].update({val: row_val})

每次都添加

row_val
(2)。


0
投票

我希望您的问题在于如何对计数器使用 update ,因为 update() 会添加计数,而不是像您期望的那样从传统字典中替换它。请参阅:https://docs.python.org/2/library/collections.html#collections.Counter


0
投票

输出

ID Counter({'ABCD': 6})
对于给定的输入数据和逻辑是正确的。

您正在对每个“ID”的所有数字字段求和并报告计数。

ID 为“ABCD”的行总共有 6 个数字字段,即:

ABCD-02-01,ABCD-02-01-0002-UNK,2123,ABCD
ABCD-02-01,ABCD-02-01-0004-UNK,31234,ABCD
ABCD-02-01,ABCD-02-01-0007-UNK,73455,ABCD

如果您解释一下您的预期结果是什么,我会更新我的答案。

© www.soinside.com 2019 - 2024. All rights reserved.