2014-09-30 72 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

相關問題