【问题标题】:Summing an Attribute Based on other Attributes in a list根据列表中的其他属性对属性求和
【发布时间】:2016-03-11 06:57:13
【问题描述】:

基本上我有一个 csv 文件,其数据如下所示:

['Store A', '2015-03-04', '00948', 'Red','A','AA']
['Store C', '2015-05-06', '00948', 'Blue','A','BB']
['Store B', '2015-07-08', '101130', 'Red','B','CC']
['Store A', '2015-09-10', '111011', 'Blue','C','DD']
['Store C', '2015-10-11', '101510', 'Red','A','EE']
['Store B', '2015-11-12', '101459', 'Red','B','FF']
['Store C', '2015-15-04', '01836', 'Blue','C','GG']
['Store B', '2015-30-05', '02201', 'Blue','A','HH']
['Store A', '2015-18-06', '04022', 'Red','C','II']
['Store C', '2015-07-07', '11056', 'Blue','B','JJ']
['Store C', '2015-08-05', '10149', 'Red','D','KK']
['Store A', '2015-10-04', '113569', 'Red','A','LL']
['Store B', '2015-12-03', '005410', 'Blue','C','MM']
['Store A', '2015-15-02', '053410', 'Blue','E','NN']
['Store A', '2015-16-04', '113410', 'Red','J','OO']

我想确定每个列表中出现“Blue”这个词的次数,这样输出基本上是给定第一个属性 Store A、B 和 C 的“Blue”这个词的总和,即需要的输出应该是:

['Store A','Blue','2']
['Store B','Blue','2']
['Store c','Blue','3']

我的代码如下:

csvReader = csv.reader(open('count.csv','rb'), delimiter=',', quotechar='"')
for line in csvReader:
    print line.count('Blue')

显然结果是:

>>> 
0
0
0
.
.
.
.
0
0

我也试过代码:

csvReader = csv.reader(open('count.csv','rb'), delimiter=',', quotechar='"')
for line in csvReader:
    count_blue= [[x, line.count('Blue')] for x in set(line)]
    print count_blue

它也没有给我所需的输出。我的错误似乎是什么?感谢您的帮助。

【问题讨论】:

  • 您的分隔符设置为,。它将根据, 而不是换行符拆分您的输入。在for 循环中尝试print(line),这样您就可以准确地看到正在输入的行。
  • 您的 csv 是否真的包含该数据(python 列表)?或者你把数据的python表示放在这里?

标签: python list count counter frequency


【解决方案1】:

我将假设您的 CSV 文件实际上是一个 CSV 文件。逗号是分隔符,quotechar 是单引号字符'

计算第 0 列中每个商店出现(从零开始的)第 3 列的次数需要按第 0 列对数据进行分组。一种方法是使用字典。 collections.defaultdict 是一种字典,可以很容易地收集具有公共键的值列表。一旦你有了它,你就可以计算出“蓝色”项目或“红色”项目的数量,或者你可能拥有的任何其他项目。

import csv
from collections import defaultdict

d = defaultdict(list) 
with open('count.csv') as f:
    for row in csv.reader(f, quotechar="'"):
        d[row[0]].append(row[3])

    for k in sorted(d):
        print('{},{}'.format(k, d[k].count('Blue')))

输出

商店 A,2 B店,2 商店 C,3

【讨论】:

  • 非常感谢您!它有帮助!
  • 嗨@TouyaD.Serdan,如果这个或任何答案已经解决了您的问题,请点击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
【解决方案2】:

这看起来不像 CSV 文件,它看起来像每行一个 Python 列表。使用literal_eval 阅读它并将其提供给Counter

from ast import literal_eval
from collections import Counter

blues = Counter()
with open("count.csv") as f:
    for line in f:
        ls = literal_eval(line)
        if ls[3] == 'Blue':
            blues[ls[0]] += 1

如果您想以所需的输出格式打印它:

for key in blues:
    print("['{}', 'Blue', {}]".format(key, blues[key]))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    相关资源
    最近更新 更多