我有一个类似于以下内容的数据集:
ID Group
1001 2
1006 2
1008 1
1027 2
1013 1
1014 4
所以基本上,还有很长的未分类ID列表以及分组变量。
目前,我想根据随机数的生成来获取此列表的子集(想象它们正在起草,或者赢得彩票等)。现在,这是我用来逐行处理ID的代码。
reader = csv.reader(open(inputname), delimiter=' ')
out1 = open(output1name,'wb')
out2 = open(output2name,'wb')
for row in reader:
assignment = gcd(1,p,marg_rate,rho)
if assignment[0,0]==1:
out1.write(row[0])
out1.write("\n")
if assignment[0,1]==1:
out2.write(row[0])
out2.write("\n")
基本上,我的gcd()函数是单向的,你被写入一个文件,另一种方式写入一秒,然后一些被抛出。问题是我现在想通过 Group 而不是ID这样做 - 基本上,我想在组成员第一次出现时分配值,然后将其应用于所有该组的成员(例如,如果1001转到文件2,那么1006和1027也是如此。)
有没有一种有效的方法在Python中执行此操作?该文件足够大,我对我的第一个想法有点警惕,即在字典或列表中进行分配,然后让程序查找每一行。
答案 0 :(得分:1)
我使用random.randint
生成一个随机数,但这很容易被替换。
我们的想法是使用defaultdict
从一个组创建之时就单个得分(dict
键是唯一的):
import csv
import random
from collections import defaultdict
reader = csv.DictReader(open(inputname), delimiter=' ')
out1 = open(output1name,'wb')
out2 = open(output2name,'wb')
# create a dictionary with a random default integer value [0, 1] for
# keys that are accessed for the first time
group_scores = defaultdict(lambda: random.randint(0,1))
for row in reader:
# set a score for current row according to it's group
# if none found - defaultdict will call it's lambda for new keys
# and create a score for this row and all who follow
score = group_scores[row['Group']]
if score==0:
out1.write(row['ID'])
out1.write("\n")
if score==1:
out2.write(row['ID'])
out2.write("\n")
out1.close()
out2.close()
我还使用DictReader
,我发现带有标题的csv
文件更好。
提示:您可能希望使用with
context manager打开文件。
示例输出:
reut@sharabani:~/python/ran$ cat out1.txt
1001
1006
1008
1027
1013
reut@sharabani:~/python/ran$ cat out2.txt
1014
答案 1 :(得分:0)
听起来你正在寻找一个映射。您可以使用dicts。
一旦你第一次确定1001转到文件2,你就可以添加到你的映射字典。
fileMap={}
fileMap[group]="fileName"
然后,当您需要检查该组是否已经确定时,您只需
>>>group in fileMap
True
这不是将每个ID映射到文件名。只需映射组。
另外,我想知道是否值得考虑使用.write([aListofLines])批量写入。