Python: Pandas,处理带空格列名

3
如果我有多个文本文件需要解析,看起来像这样,但是可能会因为列名和上面的标签长度而有所不同: txt.file 我该如何将其转换为 pandas 数据框? 我尝试使用pd.read_table('file.txt', delim_whitespace = True, skiprows = 14),但是出现了各种问题。我的问题如下:
所有文本、星号和井号都需要被忽略,但是我不能只使用 skip rows,因为在另一个文件中,所有顶部的垃圾大小可能会变化。
由于空格,列 "stat (+/-)" 和 "syst (+/-)" 被视为 4 列。
一个井号包含在列名中,我不想要它。我不能只手动分配列名,因为它们会从文本文件到文本文件变化。
非常感谢任何帮助,读取文件后,我真的不确定该怎么做。

最后一磅是致命问题。不要将文件名传递给pandas:打开一个文件对象并读取,直到找到带有“#”的最后一行,将文件指针定位到该位置,然后使用read_fwf通过提供您在该过程中读取的第一个数据单元格中可以找到的大小来读取数据。 - Zeugma
我该如何读取直到最后一行的内容? - SignalProcessed
2个回答

2

考虑使用csv模块从原始文件中读取数据,同时逐行清洗并写入新文件。使用正则表达式以i作为匹配条件来识别列标题。以下假设多个空格分隔列:

import os
import csv, re
import pandas as pd

rawfile = "path/To/RawText.txt"
tempfile = "path/To/TempText.txt"

with open(tempfile, 'w', newline='') as output_file:
    writer = csv.writer(output_file)    

    with open(rawfile, 'r') as data_file:
        for line in data_file:            
            if re.match('^.*i', line):                     # KEEP COLUMN HEADER ROW
                line = line.replace('\n', '')                
                row = line.split("  ")                
                writer.writerow(row)

            elif line.startswith('#') == False:            # REMOVE HASHTAG LINES
                line = line.replace('\n', '')
                row = line.split("  ")            
                writer.writerow(row)

df = pd.read_csv(tempfile)                                 # IMPORT TEMP  FILE
df.columns = [c.replace('# ', '') for c in df.columns]     # REMOVE '#' IN COL NAMES     

os.remove(tempfile)                                        # DELETE TEMP FILE

1
这是我在评论中提到的方法:使用文件对象来跳过需要跳过的自定义脏数据,并将文件偏移量定位到文件中适当的位置,在那里read_fwf可以轻松完成任务。
with open(rawfile, 'r') as data_file:
    while(data_file.read(1)=='#'):
        last_pound_pos = data_file.tell()
        data_file.readline()
    data_file.seek(last_pound_pos)
    df = pd.read_fwf(data_file)

df
Out[88]: 
   i      mult  stat (+/-)  syst (+/-)        Q2         x       x.1       Php
0  0  0.322541    0.018731    0.026681  1.250269  0.037525  0.148981  0.104192
1  1  0.667686    0.023593    0.033163  1.250269  0.037525  0.150414  0.211203
2  2  0.766044    0.022712    0.037836  1.250269  0.037525  0.149641  0.316589
3  3  0.668402    0.024219    0.031938  1.250269  0.037525  0.148027  0.415451
4  4  0.423496    0.020548    0.018001  1.250269  0.037525  0.154227  0.557743
5  5  0.237175    0.023561    0.007481  1.250269  0.037525  0.159904  0.750544

非常感谢!您知道我如何将其扩展到.LIST文件吗? - SignalProcessed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接