【问题标题】:Python: Pandas, dealing with spaced column namesPython:Pandas,处理间隔列名
【发布时间】:2017-02-28 08:46:03
【问题描述】:

如果我有多个需要解析的文本文件,看起来像这样,但在列名和上述主题标签的长度方面可能会有所不同:

我将如何将其转换为 pandas 数据框?我试过使用pd.read_table('file.txt', delim_whitespace = True, skiprows = 14),但它有各种各样的问题。我的问题是……

顶部的所有文本、星号和磅都需要忽略,但我不能只使用跳过行,因为顶部所有垃圾的大小在另一个文件中的长度可能会有所不同。

由于空格,“stat (+/-)”和“syst (+/-)”列被视为 4 列。

一磅符号包含在列名中,我不希望这样。我不能只手动分配列名,因为它们因文本文件而异。

非常感谢任何帮助,我只是不确定在使用 pandas 读取文件后该从哪里开始。

【问题讨论】:

  • 最后一磅是杀戮问题。不要将文件名传递给 pandas:打开一个文件对象并准备好,直到找到带磅的最后一行,寻找指向该位置的文件指针,然后通过提供您可以在第一个数据上找到的大小来使用 read_fwf你也在那个过程中阅读了
  • 我如何阅读它直到最后一磅行?

标签: python python-3.x pandas text


【解决方案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 文件吗?
【解决方案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

【讨论】:

    猜你喜欢
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多