2016-02-08 60 views
0

什么是通过在Python 2.7 CSV文件较大迭代,比较3列的最简单/最简单的方法是什么?的Python 2.7,比较3列的CSV

我是一个总初学者,只完成了几个在线课程,我已成功地使用CSV读者做的CSV文件中的一些基本的统计数据,但没有内相互比较组。

的数据被大致设置如下:

Group sub-group processed 
1   a  y 
1   a  y 
1   a  y 
1   b   
1   b 
1   b 
1   c  y 
1   c  y 
1   c 
2   d  y 
2   d  y 
2   d  y 
2   e  y 
2   e 
2   e 
2   f  y 
2   f  y 
2   f  y 
3   g 
3   g 
3   g 
3   h  y 
3   h 
3   h 

一切属于一个组,但各组内的是3行(重复)子组。由于我们是通过样品的工作,我们将加入到处理的专栏,但我们并不总是做充分的补充,所以有时只会有1或2个加工出来的潜力3.

的我正在努力朝向表示各组的%完整性的统计工作,与子组是“完整的”,如果它有处理(不必有所有3)至少1行。

我已经成功地得到了一半的,通过以下:

for row in reader: 
    all_groups[group] = all_groups.get(group,0)+1 
    if not processed == "": 
     processed_groups[group] = processed_groups.get(group,0)+1 

result = {} 
for family in (processed_groups.viewkeys() | all_groups.keys()): 
    if group in processed_groups: result.setdefault(group, []).append(processed_groups[group]) 
     if group in processed_groups: result.setdefault(group, []).append(all_groups[group]) 

for group,v1 in result.items(): 
     todo = float(v1[0]) 
     done = float(v1[1]) 
     progress = round((100/done * todo),2) 
     print group,"--", progress,"%" 

与上面的代码是它并没有考虑到一个事实,即某些子组可能不完全的问题处理。因此,除非处理的列始终完整,否则统计信息将永远不会读为100%。

What I get: 
Group 1 -- 55.56% 
Group 2 -- 77.78% 
Group 3 -- 16.67% 

What I want: 
Group 1 -- 66.67%% 
Group 2 -- 100% 
Group 3 -- 50% 

你将如何让这个它只是看起来,看第一行的各子列已经完成,只使用,继续到下一个子组之前?要做到这一点

回答

2

一种方法是用一对夫妇的套defaultdict。第一个跟踪所有看到的子组,第二个跟踪那些已经处理的子组。使用一组简化了代码一些,相比于使用标准字典时(尽管它仍然可能实现),并使用defaultdict

import csv 
from collections import defaultdict 

subgroups = defaultdict(set) 
processed_subgroups = defaultdict(set) 

with open('data.csv') as csvfile: 
    for group, subgroup, processed in csv.reader(csvfile): 
     subgroups[group].add(subgroup) 
     if processed == 'y': 
      processed_subgroups[group].add(subgroup) 

    for group in sorted(processed_subgroups): 
     print("Group {} -- {:.2f}%".format(group, (len(processed_subgroups[group])/float(len(subgroups[group])) * 100))) 

输出

 
Group 1 -- 66.67% 
Group 2 -- 100.00% 
Group 3 -- 50.00%