在Python 2.7中迭代大型CSV文件,比较3列是最简单/最简单的方法是什么?
我是初学者,只完成了一些在线课程,我已经设法使用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。
我正在努力寻找显示每个组的完整性百分比的统计信息,如果子组至少处理了1行(不必全部为3),则子组为“完整”。
通过使用以下内容,我已经成功地到了那里:
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%
如何制作它以便只查看每个子列的第一行是否完整,并在继续使用下一个子组之前使用它?
答案 0 :(得分: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%