我正在使用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。
答案 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
附近是否有足够的观测结果。