当行尾有多余空格时,将 .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的主要内容,如果未能解决你的问题,请参考以下文章

[培训更新]Python部落Vim配置更新

居中弹性项目,行尾有一个[重复]

Office WORD EXCEL批量查找和替换技巧实例

如何把DAT格式转换为EXCEL表格?

当行大小太大时如何转换MYSQL UTF-8?

如何将TXT批量转为HTML,保留TXT的空格和换行格式