【问题标题】:How to create a Pandas df from a haphazard .dat file?如何从随意的 .dat 文件创建 Pandas df?
【发布时间】:2021-03-12 23:28:54
【问题描述】:

我有一个看起来像这样的 .dat 文件。

6.74E+01  "methane"                                        "74-82-8"     "L"
5.06E+01  "ethane"                                         "74-84-0"     "L"
7.16E+01  "propane"                                        "74-98-6"     "L"
9.59E+01  "butane"                                         "106-97-8"    "L"
1.20E+02  "2-methylpropane"                                "75-28-5"     "L"
3.73E+02  "dimethylpropane"                                "463-82-1"    "L"
1.25E+02  "pentane"                                        "109-66-0"    "L"

此 .dat 文件似乎是随意创建的。据我所知,这些列由不同数量的空格分隔。 在文件的下方,有些行还有一个额外的 cmets 列。我需要将其读入 Pandas 数据框。我试过了……

raw = pd.read_table(r'FILE PATH')
raw.columns = ['Value', 'Name', 'Numbers', 'Letter']

然后抛出一个错误说“发生异常:ValueError 长度不匹配:预期轴有 1 个元素,新值有 4 个元素"

我期待一个错误,但这使它看起来只有 1 列。我完全不知所措,我希望有人能提供帮助。谢谢

编辑:额外的列有一个单独的分隔空间。

1.01E-02  "2,3-benzindene"                                 "86-73-7"     "M" ! fluorene

【问题讨论】:

  • 您能否添加一些示例行来显示“cmets 的一两列额外列”是什么样的?

标签: python pandas file cheminformatics


【解决方案1】:

假设列由空格定义,您可以使用read_tabledelim_whitespace=True 参数。

我假设该文件不包含标题行。通过names 参数指定列名,您可以避免 a) 第一行被解释为标题行和 b) 解析器被“额外列”混淆。

raw = pd.read_table(filename, delim_whitespace=True,
                    names=['Value', 'Name', 'Numbers', 'Letter'])

print(raw) 的结果:

      Value             Name   Numbers Letter
0   67.4000          methane   74-82-8      L
1   50.6000           ethane   74-84-0      L
2   71.6000          propane   74-98-6      L
3   95.9000           butane  106-97-8      L
4  120.0000  2-methylpropane   75-28-5      L
5  373.0000  dimethylpropane  463-82-1      L
6  125.0000          pentane  109-66-0      L
7    0.0101   2,3-benzindene   86-73-7      M

【讨论】:

    【解决方案2】:

    您可以尝试手动打开文件并加载数据。我使用标准的shlex 模块来去掉引号:

    import shlex
    import pandas as pd
    
    
    data = []
    with open('your_file.dat', 'r') as f_in:
        for line in f_in:
            line = line.strip()
            if not line:
                continue
            data.append(shlex.split(line)[:4])
    
    df = pd.DataFrame(data, columns=['Value', 'Name', 'Numbers', 'Letter'])
    print(df)
    

    打印:

          Value             Name   Numbers Letter
    0  6.74E+01          methane   74-82-8      L
    1  5.06E+01           ethane   74-84-0      L
    2  7.16E+01          propane   74-98-6      L
    3  9.59E+01           butane  106-97-8      L
    4  1.20E+02  2-methylpropane   75-28-5      L
    5  3.73E+02  dimethylpropane  463-82-1      L
    6  1.25E+02        pentane 2  109-66-0      L
    7  1.01E-02   2,3-benzindene   86-73-7      M
    

    【讨论】:

    • 你不需要shlex; str.split 没有参数会在空格运行时分裂。
    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    相关资源
    最近更新 更多