如何使用Python将数据组织成一行?

时间:2016-10-31 23:13:09

标签: python

数据描述 我的数据文件ExpData.txt included here包含涉及多个主题的实验结果。

1)第1列对应4位数的主题ID

2)第2列对应响应时间。 (每个受试者的试验次数范围从15到25) 看起来像这样:

   0001   81
   0001   112
   0001   125
   0001   99
   0001   120

目的: 我需要能够读取此数据文件并重新格式化每行一个主题的数据(以便更容易进行统计分析)。换句话说,每一行以主题ID开头,然后是该主题的响应时间,按升序排序并用空格分隔。 应该是这样的:

0001 80 81 . . . 120 125
0003 77 78 . . . 109 110 112 117 120 123
0005 78 78 . . . 120 120
-. . .

我需要将重新格式化的数据保存为名为ExpDataReformat.txt的单独数据文件。

关于如何做到这一点的任何想法?或者从哪里开始?

我开始尝试编辑其他人在一个帖子上共享的代码,该帖子会追加并对州和州首府进行排序。不用说,我一直在语法错误。

infile = open('TestData/StateCapitalList.txt','r') 
stateData = infile.read() 
infile.close() 

dataLines = stateData.split('\n') 

state = [] 
capital = [] 

for line in dataLines: 

    if line: 
        iState, iCapital = line.split(',') 
        state.append(iState)     
        capital.append(iCapital) 

outfile = open('TestData/sCapitalList.txt','w') 

capital.sort() 

for iCap in capital: 

    outfile.write(iCap + '\n')  

outfile.close() 

3 个答案:

答案 0 :(得分:1)

由于您的问题中未包含任何代码,因此该答案不包含任何内容。

您需要打开该文件,并创建一个空字典。

然后,对于文件中的每一行,将其拆分为subjectdata。测试该主题是否作为字典中的键存在。如果没有,请为该键创建一个字典条目,其值为包含单个元素data的列表。如果主题已存在于词典中,则将data附加到值。

当文件用尽时,对于字典中的每个键(按排序顺序)输出键值,然后输入由连接所有数据项组成的字符串,其中包含空格。

答案 1 :(得分:0)

from collections import defaultdict

result = defaultdict(list)

with open('ExpData.txt') as infile:
    for line in infile:
        key, value = line.split()
        result[key].append(int(value))

with open('out.txt', 'w') as outfile:
    for key, value_list in sorted(result.items()):
        outfile.write(' '.join([key] + map(str, sorted(value_list)))
                      + '\n')

答案 2 :(得分:0)

您可以使用groupby

from itertools import groupby

with open(path) as f:
    it=(line.split() for line in f)
    for k, g in groupby(it, key=lambda e: e[0]):
        print(k, sorted(map(int, (t[1] for t in g))))

打印:

0001 [80, 81, 81, 82, 89, 90, 97, 99, 101, 108, 112, 114, 118, 120, 120, 125]
0003 [77, 78, 84, 86, 89, 92, 99, 101, 101, 101, 103, 106, 106, 108, 109, 110, 112, 117, 120, 123]
0005 [78, 78, 83, 86, 87, 89, 95, 104, 109, 110, 113, 114, 115, 119, 120, 120]
0012 [80, 83, 86, 87, 89, 91, 92, 99, 100, 101, 101, 101, 104, 108, 110, 113, 113, 113, 120, 122, 124]
0015 [78, 78, 80, 80, 81, 81, 85, 86, 89, 91, 94, 100, 100, 102, 107, 109, 115, 116, 116, 121, 122, 123, 125, 125]
0021 [78, 79, 80, 83, 87, 88, 90, 91, 91, 96, 96, 96, 100, 102, 108, 109, 118, 125]
0024 [76, 78, 78, 83, 87, 88, 88, 89, 92, 96, 96, 103, 107, 108, 108, 108, 111, 112, 113, 119, 119, 120, 122, 123, 125]
0027 [78, 81, 84, 85, 90, 92, 95, 95, 96, 98, 99, 105, 105, 106, 108, 111, 113, 115, 118, 118, 120, 121, 123, 124]
0040 [76, 78, 79, 80, 81, 82, 82, 84, 90, 93, 93, 94, 99, 103, 104, 107, 107, 109, 114, 117, 120, 125]
0041 [75, 80, 85, 86, 87, 89, 90, 94, 94, 98, 103, 105, 106, 116, 122]
0043 [76, 83, 84, 85, 86, 86, 91, 94, 102, 105, 107, 108, 119, 123, 123, 124, 125]
0044 [81, 81, 83, 85, 85, 86, 86, 92, 95, 98, 98, 98, 99, 101, 102, 103, 106, 112, 115, 117, 118, 122]
0047 [84, 86, 90, 90, 92, 94, 94, 97, 98, 100, 101, 102, 105, 109, 111, 113, 115, 116, 118, 119, 120, 121]
0052 [75, 84, 97, 101, 103, 104, 106, 106, 110, 111, 118, 122, 123, 123, 124]
0054 [76, 78, 79, 80, 83, 85, 95, 101, 101, 104, 105, 107, 111, 113, 115, 117, 120, 120]
0057 [75, 75, 75, 76, 79, 80, 82, 82, 83, 84, 86, 90, 93, 94, 95, 95, 96, 99, 100, 102, 102, 112, 116, 119, 120, 124]
0072 [77, 78, 78, 79, 83, 88, 92, 97, 100, 101, 105, 106, 115, 115, 117]
0077 [78, 85, 86, 88, 88, 90, 98, 98, 102, 104, 105, 106, 112, 116, 121, 124]
0080 [76, 82, 84, 85, 90, 94, 100, 101, 107, 107, 109, 110, 112, 115, 115, 118, 118, 121, 122, 125]
0082 [75, 77, 80, 81, 81, 82, 83, 86, 89, 90, 96, 98, 103, 106, 108, 109, 111, 112, 112, 112, 113, 115, 117, 118, 120, 124]