Pandas 通过正则表达式读取带有字符串分隔符的 CSV 文件

3

我正在尝试将一个格式奇怪的文本文件导入到pandas DataFrame中。以下是两个示例行:

LOADED LANE       1   MAT. TYPE=    2    LEFFECT=    1    SPAN=  200.    SPACE=   10.    BETA=   3.474 LOADEFFECT 5075.    LMAX= 3643.    COV=  .13
LOADED LANE       1   MAT. TYPE=    3    LEFFECT=    1    SPAN=  200.    SPACE=   10.    BETA=   3.515 LOADEFFECT10009.    LMAX= 9732.    COV=  .08

首先我尝试了以下方法:

df = pd.read_csv('beta.txt', header=None, delim_whitespace=True, usecols=[2,5,7,9,11,13,15,17,19])

看起来这个方法还行,但是当遇到上面的例子时出现了问题,在LOADEFFECT字符串后没有空格(你可能需要向右滚动一下才能在例子中看到它)。我得到了如下结果:

632   1   2   1  200  10  3.474  5075.  3643.  0.13
633   1   3   1  200  10  3.515  LMAX=   COV=   NaN

然后我决定使用正则表达式来定义我的分隔符。经过多次尝试和错误(我不是正则表达式专家),我用以下代码实现了近似的效果:

df = pd.read_csv('beta.txt', header=None, sep='/s +|LOADED LANE|MAT. TYPE=|LEFFECT=|SPAN=|SPACE=|BETA=|LOADEFFECT|LMAX=|COV=', engine='python')

这个几乎可以工作,但似乎在一开始就创建了一个 NaN 列:
632 NaN  1  2  1  200  10  3.474   5075  3643  0.13
633 NaN  1  3  1  200  10  3.515  10009  9732  0.08

此时,我认为我可以只删除第一列,并且这样做也没问题。然而,我想知道正确的设置正则表达式以便在一个步骤中正确解析该文本文件的方法是什么?有任何想法吗?除此之外,我相信还有更聪明的方法来解析这个文本文件。期待听到您的建议。
谢谢!

1
这看起来更像是固定宽度格式。如果在文件中画竖线,数据是否保持在正确的列中? - DSM
read_fwf 就像 DSM 所提到的那样,如果格式是固定宽度,它可以读取此内容。它接受一个 width 参数,您可以通过该参数传递每个列宽的列表。 - EdChum
@DSM 是的,我认为这是一个固定宽度格式的文件。 - marillion
@EdChum,我之前不知道有read_fwf这个函数,我觉得它可以解决我的问题! - marillion
也不确定,但你最初的问题可能与行结束有关? "\r\n" vs "\n" - dartdog
@dartdog 初始问题与一个值使用了分配给它的整个固定宽度空间有关。带有“LOADEFFECT10009。”的行会破坏read_csv中的“使用空格作为分隔符”选项。EdChum的建议是,只要我拥有的文件具有相同的固定宽度格式,就可以使用read_fwf - marillion
1个回答

1
import re
import pandas as pd
import csv
csvfile = open("parsing.txt") #open text file
reader = csv.reader(csvfile)
new_list=[]
for line in reader:
    for i in line:
        new_list.append(re.findall(r'(\d*\.\d+|\d+)', i))

table = pd.DataFrame(new_list)
table # output will be pandas DataFrame with values

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接