3 回答
TA贡献1813条经验 获得超2个赞
您的分隔符是一个空格 ( ' '
),每行末尾都有一个额外的空格。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。
TA贡献1852条经验 获得超7个赞
在读取为 csv 后只需删除 NaN cols。但是如果你出于某种原因想先清理文本文件,你可以这样做:
with open("thermo_.txt", "r") as f:
a = [i.rstrip() for i in f] # removes extra ' ' spaces from right hand side
a = [i.split(' ') for i in a] # splits list into list of lists by line
df = pd.DataFrame(a).set_index(0)
TA贡献1868条经验 获得超4个赞
解决这个问题的一种方法是在正则表达式中使用“积极的前瞻”。这表示在后跟任何字符的任何空格上分隔。因此,行末尾的空格后面没有字符,因此不要分开以避免创建空列。
df = pd.read_csv(stxt, sep="\s(?=.)", header=None)
MVCE:
from io import StringIO
import pandas as pd
stxt = 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 7
0 1 1 8.40871 3.96667 1.627920 -0.024290 0.021722 -0.020292
1 2 2 8.01328 4.85028 1.641810 0.006165 -0.000003 0.005062
2 3 1 7.38052 4.83557 0.908616 0.008912 -0.002868 -0.022423
3 4 1 4.80607 4.99439 8.907990 0.025270 0.013688 0.007154
4 5 2 4.74970 4.77019 7.967840 -0.004953 -0.003361 0.005867
5 6 1 5.59201 5.07857 7.602310 0.002959 -0.014870 -0.023446
6 7 1 7.20491 1.66118 13.924200 -0.026791 -0.026355 -0.027022
7 8 2 8.00486 1.60311 14.466500 -0.002775 0.001940 0.006701
8 9 1 8.71800 1.48953 13.820900 0.008324 -0.020200 -0.006640
9 10 1 1.28567 5.55350 11.642400 0.004284 -0.002892 -0.018245
10 11 2 1.56894 4.74096 11.198700 0.006142 0.005266 0.000498
11 12 1 2.40718 4.98336 10.778200 -0.015590 -0.021794 0.003784
12 13 1 15.32500 7.97006 8.076270 0.010599 0.024435 -0.014641
添加回答
举报