我想尽可能简单地将一些数据加载到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?
答案 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(', ')
哪些列标签被排除在数据之外?