簡體   English   中英

在熊貓中讀取“長度分隔”文件?

[英]Reading “length-delimited” files in pandas?

考慮以下文件test.dat

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

從技術上講,這是一個柱狀文件,盡管事實可能不如CSV文件那樣清楚。

該文件的列是這樣划分的: 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

感謝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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM