如何在csv文件中的数据上创建非连续整数的循环?

时间:2019-07-07 16:57:23

标签: python python-3.x

我正在使用python分解csv文件。每个文件都有三列,其中一列只是整数。整数不是连续的,对于每个整数,我要提取多行数据并将其写入单独的.dat文件。例如,我想提取7或8个不同整数的所有数据,例如0、1、2、3、6、7、9或6、7、9、13、14、16、18、21、22。 csv文件中的表如下所示:

0,0,0.751622894
0,0.760816637,0.732487133
1,0.01176769,0.761377432
1,0.263682475,0.770548537
1,0.768830839,0.731812798
2,0.020187674,0.764187624
2,0.777022572,0.74336139
3,0.046867867,0.771258565
6,0.83768704,0.756484441
7,0.104007101,0.785597332
9,0.847070758,0.751622894
9,0.867841745,0.754397082
13,0.923966523,0.764187624
14,0.176667512,0.795060175
16,0.993608927,0.772680585
18,0.00887649,0.776247117
21,0.01285823,0.779112191
21,0.257595739,0.798730006
21,0.77428354,0.767008188
22,0.527212782,0.719780373
22,0.78840984,0.764891791

我有代码,但是仅当整数是连续的时才有效。

    starting_rotation_list = []   
    i=0
    #current rotation leaving the last loop is the max rotation number
    while(i < current_rotation):
        if i in Dict.keys():
            if i+1 in Dict.keys():
                if i+2 in Dict.keys():
                    if i+3 in Dict.keys():
                        if i+4 in Dict.keys():
                            if i+5 in Dict.keys():
                                if i+6 in Dict.keys():
                                    starting_rotation_list.append(i)
    i = i+1

代码运行没有错误,但是由于整数不是连续的,因此不会创建所需的.dat填充。如果我将循环编码为运行较少的整数,比如说2或3,那么它也可以正常工作,但是我需要将其用于7或8。

2 个答案:

答案 0 :(得分:1)

您可以使用defaultdict来收集与所需整数匹配的每一行。一旦在生成的data字典中读取了所有行,就可以一次将其写入一个不同的输出CSV文件。下面显示了如何完成此操作,输出的CSV文件名的格式为output_0.csv等...

from collections import defaultdict
import csv

req_values = [0, 1, 2, 3, 6, 7, 9]
data = defaultdict(list)

with open('input.csv') as f_input:
    csv_input = csv.reader(f_input)

    for row in csv_input:
        if int(row[0]) in req_values:
            data[row[0]].append(row)

for value in data:
    with open(f'output_{value}.csv', 'w', newline='') as f_output:
        csv_output = csv.writer(f_output)
        csv_output.writerows(data[value])

答案 1 :(得分:0)

您显然为{0: .761, 1: .769, ... }分配了一个像Dict这样的字典。 PEP-8要求您不要这样做。 标识符不仅是唯一的,而且由机器使用。 它们对人类也很有意义。 我们将小写字母用于字典等变量, 和定义新类时的初始大写字母。

您似乎想知道是否至少有K个观测值 发生在某个初始整数的固定窗口内。 这是计算该代码的代码:

import collections
import pprint

window = 7
s = set([0, 0, 1, 1, 1, 2, 2, 3, 6, 7, 9, 9, 13, 14, 16, 18, 21, 21, 21, 22, 22])
# s = set(Dict.keys())
total = collections.defaultdict(int)
for val in s:
    for i in range(window):
        total[val + i] += 1

pprint.pprint(total)

现在,您可以将total[n]与所需的阈值进行比较, 也许k = 4,以查看n附近是否有足够的观测结果。