2014-09-30 63 views
1

我有以下数据Python每隔n行排序一次数据?

# Data set number 1 
# 
# Number of lines 4081 
# 
# Max number of column 3 is 5 
# Blahblah 
# The explanation about each rows 
3842 1 1 3843 0   0.873   0.922   0.000   0.317 
3843 2 2 3842 3844 0   0.873   0.873   1.747   2.000  -0.614 
3844 1 1 3843 0   0.873   0.922   0.000   0.312 
...... 
2191 3 2 2117 2120 0   0.925   0.934   1.878   2.000  -0.750 
# Data set number 2 
# 
# Number of lines 4081 
# 
# Max number of column 3 is 5 
# Blahblah 
# The explanation about each rows 
3842 1 1 3843 0   0.873   0.922   0.000   0.317 
3843 2 2 3842 3844 0   0.873   0.873   1.747   2.000  -0.614 

我的数据具有2010的数据集的重复格式,它由7个标题行+ 4081条数据线。如何对数据行进行排序,而不是整个数据行,但是在重复数据集内?所以,我希望对每个数据集的每个8〜4081行进行排序。

ps)我希望排序数据w.r.t第一列,我的意思是按列排序。因此,数据的第一列,应责令等栏目遵循

回答

1

您可以使用numpy的,以数据集分成数据块:

import numpy as np 
full = [line for line in open("foo4",'r').readlines() if not line.startswith("#")] 
datablocks = np.split(np.array(full), len(full)/4081) 
for block in datablocks: 
    #lines is a dataset, sorted by first column 
    lines = sorted(block, key= lambda line : int(line.split()[0])) 
    print lines 
+0

谢谢。我有额外的问题。我如何阅读每个数据库的每一列和每行?另外,我怎样才能从这些数据中只读整数?我希望为每个数据块的每行每列索引每个数据块,只使用整数 – exsonic01 2014-10-03 18:10:19

+0

我试图使用类似于“column1 = lines.split()[0]”的命令,但它表示列表对象没有属性拆分。但是像“print lines [0] .split()[3]”这样的命令可以工作。我无法理解。 – exsonic01 2014-10-03 18:51:56

1

你知道,标题是7行,所以你可以忽略:

data_txt='''\ 
# Data set number 1 
# 
# Number of lines 4081 
# 
# Max number of column 3 is 5 
# Blahblah 
# The explanation about each rows 
3842 1 1 3843 0   0.873   0.922   0.000   0.317 
3843 2 2 3842 3844 0   0.873   0.873   1.747   2.000  -0.614 
3844 1 1 3843 0   0.873   0.922   0.000   0.312''' 

data_lines=data_txt.splitlines() 
data=[map(float,line.split()) for line in data_lines[7:]] 

print data 
# [[3842.0, 1.0, 1.0, 3843.0, 0.0, 0.873, 0.922, 0.0, 0.317], [3843.0, 2.0, 2.0, 3842.0, 3844.0, 0.0, 0.873, 0.873, 1.747, 2.0, -0.614], [3844.0, 1.0, 1.0, 3843.0, 0.0, 0.873, 0.922, 0.0, 0.312]] 

然后,如果你要排序的第一元素列表:

data=sorted(data, key=lambda l: l[0]) 
print data 
# [[3842.0, 1.0, 1.0, 3843.0, 0.0, 0.873, 0.922, 0.0, 0.317], [3843.0, 2.0, 2.0, 3842.0, 3844.0, 0.0, 0.873, 0.873, 1.747, 2.0, -0.614], [3844.0, 1.0, 1.0, 3843.0, 0.0, 0.873, 0.922, 0.0, 0.312]] 

如果你想独自离开的第一个元素,但每个排序列表的其余部分:

data=[[e[0]]+sorted(e[1:]) for e in data] 

+0

感谢。我错过了提及,但我希望将第一栏的所有数据排序。所以我希望按照第一列号的顺序重新排列数据 – exsonic01 2014-09-30 03:02:43

1

这样的事情应该工作。

f_in = open('input', 'r') 
f_out = open('output', 'w') 

while True: 
    hdr = [] 
    for i in xrange(7): 
     hdr.append(f_in.readline()) 
    # Detect end-of-file condition 
    if not hdr[0]: 
     break 

    data = [] 
    for i in xrange(4081): 
     data.append(f_in.readline()) 
    data.sort() 
    f_out.writelines(hdr) 
    f_out.writelines(data) 

f_in.close() 
f_out.close() 
+0

谢谢,排序的数据有点奇怪,它按1,10,100,1000顺序排序。我忘了提及,但是在eacg数据集的最后一行(每个数据集的每个第4089行),都有一个'#'。我怎样才能包含那个'#'?无论如何感谢 – exsonic01 2014-09-30 03:25:48

+0

第一部分:您将可变长度数字排序为字符串。排序时使用'key'参数。第二部分:如果'#'应该总是在末尾,请添加第三部分来阅读预告片行。 – 2014-09-30 03:29:40

+0

关键参数?我无法得到你的解释(我仍然是业余的Python惋惜)。你能给我一个提示吗? – exsonic01 2014-09-30 03:34:27

相关问题