2013-07-02 161 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) 

可以在任何一個請幫我找出一個Python化的方式來找到,如果兩個值是相同的。

回答

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

您可以通過功能使用Python組 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