如何从随意的 .dat 文件创建 Pandas df?
How to create a Pandas df from a haphazard .dat file?
我有一个看起来像这样的 .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 文件似乎是随意创建的。据我所知,这些列由不同数量的 space 分隔。 在文件的下方,一些行还有一个额外的注释列。我需要将其读入 Pandas 数据框。我试过了...
raw = pd.read_table(r'FILE PATH')
raw.columns = ['Value', 'Name', 'Numbers', 'Letter']
然后抛出一条错误消息“发生异常:ValueError
长度不匹配:预期轴有 1 个元素,新值有 4 个元素
我原以为会出现错误,但这让它看起来只有 1 列。我完全不知所措,希望有人能提供帮助。谢谢
编辑:额外的列有一个 space 分隔。
1.01E-02 "2,3-benzindene" "86-73-7" "M" ! fluorene
您可以尝试手动打开文件加载数据。我正在使用标准 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
假设列是由连续的空格定义的,您可以使用 read_table
的 delim_whitespace=True
参数。
我假设该文件不包含 header 行。通过 names
参数指定列名,可以避免 a) 第一行被解释为 header 行和 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
我有一个看起来像这样的 .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 文件似乎是随意创建的。据我所知,这些列由不同数量的 space 分隔。 在文件的下方,一些行还有一个额外的注释列。我需要将其读入 Pandas 数据框。我试过了...
raw = pd.read_table(r'FILE PATH')
raw.columns = ['Value', 'Name', 'Numbers', 'Letter']
然后抛出一条错误消息“发生异常:ValueError 长度不匹配:预期轴有 1 个元素,新值有 4 个元素
我原以为会出现错误,但这让它看起来只有 1 列。我完全不知所措,希望有人能提供帮助。谢谢
编辑:额外的列有一个 space 分隔。
1.01E-02 "2,3-benzindene" "86-73-7" "M" ! fluorene
您可以尝试手动打开文件加载数据。我正在使用标准 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
假设列是由连续的空格定义的,您可以使用 read_table
的 delim_whitespace=True
参数。
我假设该文件不包含 header 行。通过 names
参数指定列名,可以避免 a) 第一行被解释为 header 行和 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