当行尾有多余空格时,将 .dat 文件转换为 DataFrame
Posted
技术标签:
【中文标题】当行尾有多余空格时,将 .dat 文件转换为 DataFrame【英文标题】:Convert .dat file into DataFrame when there is extra whitespace at the end of rows 【发布时间】:2022-01-14 04:29:24 【问题描述】:我正在尝试将数据 .dat
文件转换为 pandas 数据框。但是,.dat
文件在每一行的末尾包含额外的空格,这在将文件作为数据帧读取时会产生问题。
.dat
文件如下所示:
~ H H H H H H H H ~ ~
~ H H H H H H H H ~ ~
~ H H H H H H T T ~ ~
有十列由空格分隔,但是在第十列之后的每一行的末尾也有空格。因此,当我将其视为 pandas 数据框时,我会看到 11 列,其中最后一列是空的。
file = "mydata.dat"
colnames = ['res76','res77','res78','res79','res80','res81','res82','res83','res84','res85','res86']
import pandas as pd
df= pd.read_csv(file,sep=' ', names=colnames)
df
最后,dataframe 如下所示:
res76 res77 res78 res79 res80 res81 res82 res83 res84 res85 res86
~ H H H H H H H H ~ ~ NaN
~ H H H H H H H H ~ ~ NaN
~ H H H H H H T T ~ ~ NaN
我认为这是由.dat
文件中每一行末尾的额外空格引起的。但是,我不确定如何使用 pandas 来处理它。例如,是否可以省略最后的空格?如有任何建议,我将不胜感激。
【问题讨论】:
“有十列由空格分隔,但是在第十列之后的每一行的末尾也有空格。” 我数了 11 列,还有 11 个明确给定的列名称。据我所知,你最后得到一个空列的原因是 Pandas 使用每行上的初始~
作为 index 而不是列值。
【参考方案1】:
鉴于您的输入格式,最好使用read_fwf
而不是read_csv
df = pd.read_fwf('mydata.dat', names=colnames)
res76 res77 res78 res79 res80 res81 res82 res83 res84 res85 res86
0 ~ H H H H H H H H ~ ~
1 ~ H H H H H H H H ~ ~
2 ~ H H H H H H T T ~ ~
【讨论】:
【参考方案2】:用 Pandas 解决这个问题的 3 个解决方案:
read_csv
:
>>> pd.read_csv(file, sep='\s+', engine='python', names=colnames)
res76 res77 res78 res79 res80 res81 res82 res83 res84 res85 res86
0 ~ H H H H H H H H ~ ~
1 ~ H H H H H H H H ~ ~
2 ~ H H H H H H T T ~ ~
read_fwf
:
>>> pd.read_fwf(file, names=colnames)
res76 res77 res78 res79 res80 res81 res82 res83 res84 res85 res86
0 ~ H H H H H H H H ~ ~
1 ~ H H H H H H H H ~ ~
2 ~ H H H H H H T T ~ ~
read_table
:
>>> pd.read_table(file, sep=' ', names=colnames)
res76 res77 res78 res79 res80 res81 res82 res83 res84 res85 res86
0 ~ H H H H H H H H ~ ~
1 ~ H H H H H H H H ~ ~
2 ~ H H H H H H T T ~ ~
【讨论】:
当' '
作为分隔符时,Pandas 会在末尾看到一个空列,并生成一个空列。但是当colnames
的数量与该数据不匹配时,不稳定的行为是什么?我尝试了不同长度的测试,得到了一些非常奇怪的结果。特别是,由于名称不足,它似乎使用前导数据作为索引,但有时会以我无法理解的方式截断这些结果标签。【参考方案3】:
您可以从数据框中删除最后一列
df.drop(df.columns[-1], axis=1, inplace=True)
或者您可以遍历文件以删除尾随空格(尽管不是一个干净的解决方案)。
parsed_file = open("parsed.dat", "w")
with open('mydata.dat') as mydatafile:
for line in mydatafile:
if line.endswith(" \n"): line = line.strip()
parsed_file.write(line+"\n")
parsed_file.close()
【讨论】:
以上是关于当行尾有多余空格时,将 .dat 文件转换为 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章