读大熊猫中的“长度分隔”文件?

时间:2017-04-12 16:50:06

标签: python pandas parsing dataframe

考虑以下文件test.dat

123ABC3.5401
456DEF3.9001
789FED10.902
122GRE16.003
133SSA42.102
145ASS45.001

这在技术上是一个柱状文件,尽管这个事实可能不像文件那样清晰。

此文件的列是这样分隔的:ID是前三个字符(即从索引0到2运行,包括零索引字符串),Group从第四到第六个字符,Value占据七到十二个字符。

以下是我当前正在阅读此文件并将其转换为pandas.DataFrame对象的方式:

import pandas as pd

col_lengths = {'ID': range(0, 3), 'Group': range(3, 6), 'Value': range(6, 12)}
col_lengths = {k: set(v) for k, v in col_lengths.items()}

df = pd.DataFrame(data=None, columns=col_lengths.keys())

with open('length_delimiter_test.dat', 'r') as f:
    for row in f:
        current = row.strip()
        values_enum = list(enumerate(current))
        row_dict = {col: ''.join(v for idx, v in values_enum if idx in col_lengths[col]) for col in col_lengths}
        df = df.append(row_dict, ignore_index=True)

这给了我想要的东西:

  Group   ID   Value
0   ABC  123  3.5401
1   DEF  456  3.9001
2   FED  789  10.902
3   GRE  122  16.003
4   SSA  133  42.102
5   ASS  145  45.001

然而,这种方法对我来说有点冗长。我基本上希望将上面的col_lengths字典传递给类似pandas.read_table的函数,但我没有在pandas文档中看到任何允许这种行为的内容。像这样:

df = pd.read_table('length_delimiter_test.dat', col_parser=col_lengths)

有没有人知道pandas(或任何Python包)中更简洁的内置功能?我没有找到任何有关解析长度分隔文件的强大包。

修改:感谢MaxU将我推荐给pandas.read_fwf

pd.read_fwf('length_delimiter_test.dat', colspecs=[(min(x), max(x)+1) for x in col_lengths.values()], header=None, names=col_lengths.keys())
Out[55]: 
 Group   ID    Value
0  ABC  123   3.5401
1  DEF  456   3.9001
2  FED  789  10.9020
3  GRE  122  16.0030
4  SSA  133  42.1020
5  ASS  145  45.0010

1 个答案:

答案 0 :(得分:0)

感谢MaxU(他应该真的得到这个答案的功劳)引用我pandas.read_fwf

pd.read_fwf('length_delimiter_test.dat', colspecs=[(min(x), max(x)+1) for x in col_lengths.values()], header=None, names=col_lengths.keys())
Out[55]: 
 Group   ID    Value
0  ABC  123   3.5401
1  DEF  456   3.9001
2  FED  789  10.9020
3  GRE  122  16.0030
4  SSA  133  42.1020
5  ASS  145  45.0010