考虑以下文件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
答案 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