2013-07-02 214 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