将注释的列名称读入pandas

时间:2015-03-03 17:28:47

标签: python pandas data-import

我想尽可能简单地将一些数据加载到python pandas中进行操作。数据采用以下格式,我无法控制:

# file generated on Sun Feb  8 23:42:56 2015
# structure, X2, Rg, filename
1       1.100341        83.720000       run2/crysol//run2_00001 0.840187
2       1.048154        83.730000       run2/crysol//run2_00002 0.788968
3       1.056927        83.730000       run2/crysol//run2_00003 0.793954
4       1.481612        84.040000       run2/crysol//run2_00004 0.786256

我找到了一种使用read_table读取数据的方法,但只能通过打开文本文件并使用以下内容单独读取行来提取列名:

In [1]: data = pd.read_table('data.txt', sep='\t', skiprows=2, header=None)
Out[1]:
     0          1      2                        3         4
0    1   1.100341  83.72  run2/crysol//run2_00001  0.840187
1    2   1.048154  83.73  run2/crysol//run2_00002  0.788968
2    3   1.056927  83.73  run2/crysol//run2_00003  0.793954
3    4   1.481612  84.04  run2/crysol//run2_00004  0.786256
In [2]: header = open('data.txt', 'r').readlines()[1].lstrip('#').strip().split(', ')
In [3]: header.append('unknown')
In [4]: data.columns = header
In [5]: print data
    structure         X2     Rg                 filename   unknown
0           1   1.100341  83.72  run2/crysol//run2_00001  0.840187
1           2   1.048154  83.73  run2/crysol//run2_00002  0.788968
2           3   1.056927  83.73  run2/crysol//run2_00003  0.793954
3           4   1.481612  84.04  run2/crysol//run2_00004  0.786256
4           5   1.634436  84.03  run2/crysol//run2_00005  0.935468

它意识到,当数据以制表符分隔时,列名以逗号分隔的内容变得复杂。此外,我不确定为什么其中一个列标签被排除在数据头之外。

有没有办法更简单地使用pandas?

1 个答案:

答案 0 :(得分:1)

虽然可能告诉parser如何处理以逗号分隔的标题,但这对您的解决方案有轻微的性能提升。只读文件的前两行:

data = pd.read_table('data.txt', sep='\t', skiprows=2, header=None)
#read first two lines
with open('data.txt', 'r') as f:
    _, line2 = f.readline(), f.readline()

由于readline()只是逐行移动指针,这比读取所有行更有效。

data.columns = line2.lstrip('#').strip().split(', ')

哪些列标签被排除在数据之外?