熊猫数据框中不存在的列

我有一个名为 cleaned_coords.txt 的数据文件,我正在将其提取到熊猫数据框中。这是 cleaned_coords.txt 的样子:


1 1 8.40871 3.96667 1.62792 -0.0242897 0.0217222 -0.0202916 

2 2 8.01328 4.85028 1.64181 0.00616535 -2.50788e-06 0.00506225 

3 1 7.38052 4.83557 0.908616 0.00891202 -0.00286839 -0.0224226 

4 1 4.80607 4.99439 8.90799 0.02527 0.0136878 0.00715371 

5 2 4.7497 4.77019 7.96784 -0.00495311 -0.0033607 0.00586672 

6 1 5.59201 5.07857 7.60231 0.00295874 -0.0148703 -0.0234462 

7 1 7.20491 1.66118 13.9242 -0.0267906 -0.0263551 -0.0270223 

8 2 8.00486 1.60311 14.4665 -0.00277453 0.00193951 0.00670056 

9 1 8.718 1.48953 13.8209 0.00832425 -0.0201998 -0.00663991 

10 1 1.28567 5.5535 11.6424 0.00428372 -0.00289222 -0.0182445 

11 2 1.56894 4.74096 11.1987 0.00614187 0.00526615 0.000498092 

12 1 2.40718 4.98336 10.7782 -0.0155901 -0.0217939 0.00378399 

13 1 15.325 7.97006 8.07627 0.010599 0.0244346 -0.0146411 

它只是数据列,一直到第 22875 行。


这是我正在运行的 python 脚本:


import numpy as np

import pandas as pd


#data = pd.read_csv('thermo_.txt', sep=" ", header=None)

data = pd.read_csv('cleaned_coords.txt', sep=" ", header=None)

df = pd.DataFrame(data)


print(df)

这是我看到的结果:


~/Desktop/Work/Simulations/water_tip3p $ python3 data_parser.py

         0  1        2         3         4         5         6         7   8

0        1  1  8.40871   3.96667  1.627920 -0.024290  0.021722 -0.020292 NaN

1        2  2  8.01328   4.85028  1.641810  0.006165 -0.000003  0.005062 NaN

2        3  1  7.38052   4.83557  0.908616  0.008912 -0.002868 -0.022423 NaN

3        4  1  4.80607   4.99439  8.907990  0.025270  0.013688  0.007154 NaN

4        5  2  4.74970   4.77019  7.967840 -0.004953 -0.003361  0.005867 NaN

...    ... ..      ...       ...       ...       ...       ...       ...  ..


我的问题是,为什么我会看到带有NaN条目的列索引 8?为什么它甚至看到列索引为 8?


MM们
浏览 95回答 3
3回答

慕姐8265434

您的分隔符是一个空格 ( ' '),每行末尾都有一个额外的空格。pandas 将在最后一个空格处拆分,并且由于该空格后没有任何内容,因此创建一个包含所有NaN值的列。理想情况下,您应该修复文本文件的生成方式并删除每行末尾的额外分隔符。如果工作量太大或不可能,一个简单的解决方案是读入所有内容并忽略最后一列:df = pd.read_csv('cleaned_coords.txt', sep=' ', header=None).iloc[:, :-1]如果您不确定事先是否存在问题,您可以阅读所有内容并删除完全无用的NaN列:df = pd.read_csv('cleaned_coords.txt', sep=' ', header=None).dropna(how='all', axis=1)*pd.read_csv已经返回一个DataFrame. 无需再次调用 pd.DataFrame。

慕姐4208626

在读取为 csv 后只需删除 NaN cols。但是如果你出于某种原因想先清理文本文件,你可以这样做:with open("thermo_.txt", "r") as f:    a = [i.rstrip() for i in f]  # removes extra ' ' spaces from right hand sidea = [i.split(' ') for i in a]    # splits list into list of lists by linedf = pd.DataFrame(a).set_index(0)

MYYA

解决这个问题的一种方法是在正则表达式中使用“积极的前瞻”。这表示在后跟任何字符的任何空格上分隔。因此,行末尾的空格后面没有字符,因此不要分开以避免创建空列。df = pd.read_csv(stxt, sep="\s(?=.)", header=None)MVCE:from io import StringIOimport pandas as pdstxt = StringIO("""1 1 8.40871 3.96667 1.62792 -0.0242897 0.0217222 -0.0202916 2 2 8.01328 4.85028 1.64181 0.00616535 -2.50788e-06 0.00506225 3 1 7.38052 4.83557 0.908616 0.00891202 -0.00286839 -0.0224226 4 1 4.80607 4.99439 8.90799 0.02527 0.0136878 0.00715371 5 2 4.7497 4.77019 7.96784 -0.00495311 -0.0033607 0.00586672 6 1 5.59201 5.07857 7.60231 0.00295874 -0.0148703 -0.0234462 7 1 7.20491 1.66118 13.9242 -0.0267906 -0.0263551 -0.0270223 8 2 8.00486 1.60311 14.4665 -0.00277453 0.00193951 0.00670056 9 1 8.718 1.48953 13.8209 0.00832425 -0.0201998 -0.00663991 10 1 1.28567 5.5535 11.6424 0.00428372 -0.00289222 -0.0182445 11 2 1.56894 4.74096 11.1987 0.00614187 0.00526615 0.000498092 12 1 2.40718 4.98336 10.7782 -0.0155901 -0.0217939 0.00378399 13 1 15.325 7.97006 8.07627 0.010599 0.0244346 -0.0146411 """)df = pd.read_csv(stxt, sep="\s(?=.)", header=None, engine='python')# Note if you just did sep=" ", you get the 9th column 8 with NaNs.df输出:     0  1         2        3          4         5         6         70    1  1   8.40871  3.96667   1.627920 -0.024290  0.021722 -0.0202921    2  2   8.01328  4.85028   1.641810  0.006165 -0.000003  0.0050622    3  1   7.38052  4.83557   0.908616  0.008912 -0.002868 -0.0224233    4  1   4.80607  4.99439   8.907990  0.025270  0.013688  0.0071544    5  2   4.74970  4.77019   7.967840 -0.004953 -0.003361  0.0058675    6  1   5.59201  5.07857   7.602310  0.002959 -0.014870 -0.0234466    7  1   7.20491  1.66118  13.924200 -0.026791 -0.026355 -0.0270227    8  2   8.00486  1.60311  14.466500 -0.002775  0.001940  0.0067018    9  1   8.71800  1.48953  13.820900  0.008324 -0.020200 -0.0066409   10  1   1.28567  5.55350  11.642400  0.004284 -0.002892 -0.01824510  11  2   1.56894  4.74096  11.198700  0.006142  0.005266  0.00049811  12  1   2.40718  4.98336  10.778200 -0.015590 -0.021794  0.00378412  13  1  15.32500  7.97006   8.076270  0.010599  0.024435 -0.014641
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python