熊猫阅读CSV与字符串分隔符通过正则表达式
问题描述:
我想导入一个奇怪的格式文本文件到一个熊猫数据框。两个例子线以下:熊猫阅读CSV与字符串分隔符通过正则表达式
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
在这一点上,我想我可以删除第一列,并摆脱它。但是我想知道设置正则表达式正确解析这个文本文件的正确方法是什么。有任何想法吗?除此之外,我相信有一个更聪明的方法来解析这个文本文件。我很乐意听到你的建议。
谢谢!
答
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
对我来说,这看起来更像是一个固定宽度的格式。如果您在文件中绘制垂直线,数据是否保留在正确的列中? – DSM
像DSM提到的'read_fwf'可以读取这个,如果格式是固定宽度的,它接受'width'参数,你可以传递每列宽度的列表 – EdChum
@DSM是的,我认为它是一个固定宽度格式文件。 – marillion