【问题标题】:Unwanted white spaces resulting into distorted column不需要的空白导致列失真
【发布时间】:2021-03-30 11:23:48
【问题描述】:

我正在尝试从一个隔开(不是标签)的 txt 文件中导入化学品列表。

NO FORMULA NAME CAS No A B C D TMIN TMAX code ngas@TMIN ngas@25 C ngas@TMAX
1 CBrClF2 bromochlorodifluoromethane 353-59-3 -0.0799 4.9660E-01 -6.3021E-05 -9.0961E-09 200 1500 2 96.65 142.14 572.33
2 CBrCl2F bromodichlorofluoromethane 353-58-2 4.0684 4.1343E-01 1.6576E-05 -3.4388E-08 200 1500 2 87.14 127.90 545.46
3 CBrCl3 bromotrichloromethane 75-62-7 7.3767 3.5056E-01 6.9163E-05 -4.9571E-08 200 1500 2 79.86 116.73 521.53
4 CBrF3 bromotrifluoromethane 75-63-8 -9.5253 6.5020E-01 -3.4459E-04 1.0987E-07 230 1500 1,2 123.13 156.61 561.26
5 CBr2F2 dibromodifluoromethane 75-61-6 2.8167 4.9405E-01 -1.2627E-05 -2.8629E-08 200 1500 2 100.89 148.24 618.87
6 CBr4 carbon tetrabromide 558-13-4 10.6812 3.2869E-01 1.0739E-04 -6.0788E-08 200 1500 2 80.23 116.62 540.18
7 CClF3 chlorotrifluoromethane 75-72-9 13.8075 4.7487E-01 -1.3368E-04 2.2485E-08 230 1500 1,2 116.23 144.10 501.22
8 CClN cyanogen chloride 506-77-4 0.8665 3.6619E-01 -2.9975E-05 -1.3191E-08 200 1500 2 72.80 107.03 438.19

当我使用 pandas 导入时

df = pd.read_csv('trial1.txt', sep='\s')

我明白了:

对于前 5 个化合物(索引 0-4),名称在 Name 列中正确,但对于第 6 个(索引 5)和第 8 个(索引 7)化合物 - 它们的名称因 空格 而分开它转到CAS。导致CAS 列值在No 列和值之下,以此类推。

有没有办法消除这个问题?谢谢

【问题讨论】:

  • 你可以将文本文件作为文本而不是图像发布。..
  • 正则表达式可以帮到你。

标签: python pandas string dataframe csv


【解决方案1】:

我建议您在将“trial1.txt”文件加载到 df 之前对其进行一些处理。下面的代码会得到你最终想要得到的结果:

with open ('trial1.txt') as f:
    l=f.readlines()

l=[i.split() for i in l]
target=len(l[1])
for i in range(1,len(l)):
    if len(l[i])>target:
        l[i][2]=l[i][2]+' '+l[i][3]
        l[i].pop(3)
l=['#'.join(k) for k in l] #supposing that there is no '#' in your entire file, otherwise use some other rare symbol that doesn't eist in your file
l=[i+'\n' for i in l]
 
with open ('trial2.txt', 'w') as f:
    f.writelines(l)

df = pd.read_csv('trial2.txt', sep='#', index_col=0)

【讨论】:

  • 感谢您的回答。当我运行您的代码时TypeError: writelines() takes exactly one argument (0 given)。所以不知道如何在那里进行。你能帮忙吗?
  • 您能否粘贴使用我的解决方案创建的 df 示例?
  • len(l) 的结果是什么?是 1 吗?
  • 我对代码做了一些更改,请重试。问题是应该是l=[['#'.join(k)] for k in l] 而不是l=['#'.join(k) for k in l]
  • 嗨@pukumarathe我已经更新了我的答案,请再次检查,它现在应该可以正常工作了
【解决方案2】:

试试这个:

您基本上必须去掉名称列中单词之间的空格。所以这里我先读取文件,然后用re.sub去掉NAME列中的空格。

在这段代码中,我假设单词的两边至少用 5 个字母分隔。您可以根据需要更改该号码{5}

import re
with open('trial1.txt', 'r') as f:
    lines = f.readlines()
l = [re.sub(r"([a-z]{5,})\s([a-z]{5,})", r"\1\2", line) for line in lines] 
df = pd.read_csv(io.StringIO('\n'.join(l)), delim_whitespace=True)

打印:

NO  FORMULA NAME                        CAS          No     A       B            C              D       TMIN    TMAX    code    ngas@TMIN   ngas@25 C.1 ngas@TMAX
1   CBrClF2 bromochlorodifluoromethane  353-59-3    -0.0799 0.49660 -0.000063   -9.096100e-09   200     1500    2       96.65   142.14      572.33  NaN NaN
2   CBrCl2F bromodichlorofluoromethane  353-58-2    4.0684  0.41343  0.000017   -3.438800e-08   200     1500    2       87.14   127.90      545.46  NaN NaN
3   CBrCl3  bromotrichloromethane       75-62-7     7.3767  0.35056  0.000069   -4.957100e-08   200     1500    2       79.86   116.73      521.53  NaN NaN
4   CBrF3   bromotrifluoromethane       75-63-8     -9.5253 0.65020 -0.000345    1.098700e-07   230     1500    1,2     123.13  156.61      561.26  NaN NaN
5   CBr2F2  dibromodifluoromethane      75-61-6     2.8167  0.49405 -0.000013   -2.862900e-08   200     1500    2       100.89  148.24      618.87  NaN NaN
6   CBr4    carbontetrabromide          558-13-4    10.6812 0.32869  0.000107   -6.078800e-08   200     1500    2       80.23   116.62      540.18  NaN NaN
7   CClF3   chlorotrifluoromethane      75-72-9     13.8075 0.47487 -0.000134    2.248500e-08   230     1500    1,2     116.23  144.10      501.22  NaN NaN
8   CClN    cyanogenchloride            506-77-4    0.8665  0.36619 -0.000030   -1.319100e-08   200     1500    2       72.80   107.03      438.19  NaN NaN

【讨论】:

  • 嗨@sharathnatraj,非常感谢您的回答。在我的 spyder 中,df = pd.read_csv(io.StringIO('\n'.join(l)), delim_whitespace=True) 不起作用。错误如下:NameError: name 'io' is not defined。我错过了什么?
  • 你可以试试import io
  • 非常感谢.. 完全按照我想要的方式工作。 :D
猜你喜欢
  • 2021-04-03
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多