2016-03-11 4 views
1

В принципе у меня есть 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'] 

Я хотел, чтобы определить, сколько раз слово «голубой» произошло для каждого из списка, таким образом, что выход в основном сумма слова «голубой», учитывая первый атрибут, который является магазин A, B и C, то необходимо вывод должен быть:

['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 

также не дает мне необходимую продукцию. Что, кажется, моя ошибка? Спасибо за помощь.

+0

Ваш разделитель установлен в ''. Он будет разделять ваш вход на основе ',', а не новых строк. Попробуйте 'print (line)' внутри вашего цикла 'for', чтобы вы могли точно видеть, какие строки подаются. –

+0

Действительно ли ваш csv содержит эти данные (списки python)? или вы помещаете представление данных на python здесь? –

ответ

1

я собираюсь предположить, что ваш файл CSV в действительности CSV-файл. Comma - разделитель, а катчар - это одиночный кавычек char '.

Подсчет количества раз, когда столбец 3 с нулевым значением встречается для каждого хранилища в столбце 0, требует группировки данных по столбцу 0. Один из способов сделать это со словарем. A 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'))) 

Выход

 
Store A,2 
Store B,2 
Store C,3 
+0

Большое вам спасибо за это! помогает! –

+0

Привет @ TouyaD.Serdan, если этот или любой ответ разрешил ваш вопрос, пожалуйста, рассмотрите [его принятие] (http://meta.stackexchange.com/q/5234/179419), нажав галочку. Это указывает более широкому сообществу, что вы нашли решение и дали некоторую репутацию как самому, так и самому себе. Это не обязательно. – BioGeek

1

Это не похоже на файл 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])) 
Смежные вопросы