2013-07-02 2 views
0

Я пытаюсь сравнить две строки в csv. Например:Сравнение двух строк в файле csv - Python

abc, 2, foo, bar, baz 
abc, 2, bar,baz, band 
cab, 3, baz,bar, foo 
cab, 3, baz,bar, foo 

Есть ли способ csv модуль или любой модуль питона, чтобы проверить, если столбец 1 является одинаковым или различным.

Например, в первых двух строках, мы видим 2, а в третьей строке - номер 3. есть способ, чтобы найти, что из

Идея, лежащая в это просуммировать значения, соответствующие определенному значению в column 1

так,

abc, 2, 10,11,12 
abc, 2, 7,8,9 
cab, 3, 4,5,6 
cab, 3, 1,2,3 

я принципиально хочу суммировать значения 12+9 поскольку он имеет тот же столбец 1. и номера 6 and 3, так как значение 3 в столбце 1

Подводя итог, я предполагаю, что могу создать список с

a=list() 

добавить значение в этот список

a.append(float(line[4])) 

и использовать NumPy подводить итоги

numpy.sum(a) 

Может ли одна просьба помочь мне выяснить вещий способ найти, если два значения одинаковы.

ответ

1

Что-то вроде этого:

>>> from collections import Counter 
>>> c = Counter() 
with open('abc') as f: 
    reader = csv.reader(f, delimiter = ',', skipinitialspace = True) 
    for row in reader: 
     c[row[1]] += int(row[-1]) 
...   
>>> c 
Counter({'2': 21, '3': 9}) 

Чтобы найти столбцы с помощью itertools.groupby:

>>> with open('abc') as f: 
    reader = csv.reader(f, delimiter = ',', skipinitialspace = True) 
    for k,g in groupby(enumerate(reader), key = lambda x:x[1][1]): 
     print k," was common on the rows :",",".join(str(x[0]) for x in g) 
...   
2 was common on the rows : 0,1 
3 was common on the rows : 2,3 
+0

Нельзя сказать что-то подобное. 'для строки в считывателе:' 'для строки в строке:' 'print row' – pistal

+0

@pistal Я выполняю итерацию только по каждой строке. –

0

Вы можете использовать питона группу функцией http://docs.python.org/2/library/itertools.html#itertools.groupby

from itertools import groupby 
grouped = groupby(data, lambda x: x[1]) 

это даст вам данные сгруппированы по второй колонке. Тогда вы можете получить сумму для каждого ключа с помощью:

for key, values in grouped: 
    columnSum = sum(map(lambda x: int(x[4]), values)) 
1

Посмотрите на pandas библиотеке, вы можете легко агрегатные столбцы на основе групп. Например, если у вас есть CSV-файл, как:

col1,col2,col3,col4,col5 
abc,2,10,11,12 
abc,2,7,8,9 
cab,3,4,5,6 
cab,3,1,2,3 

Вы можете группировать и сумма на основе значений в col2 всего пару строк кода:

import pandas as pd 
df = pd.DataFrame.from_csv('test.csv') 
df.groupby('col2').sum() 

, который дает вам:

 col3 col4 col5 
col2     
2  17 19 21 
3  5  7  9 
+0

+1 за то, что представил меня в эту библиотеку! – pistal

+0

Я пытаюсь записать его в файл csv с помощью 'http: // stackoverflow.com/questions/11105728/pivoting-a-dataframe-in-pandas-for-output-to-csv' Не могли бы вы помочь я с этим? – pistal

Смежные вопросы