【问题标题】:Using header information in a text file to organise a dataframe使用文本文件中的标题信息来组织数据框
【发布时间】:2019-05-02 15:32:36
【问题描述】:

我有一个格式如下的文本文件:

_data

loop_

_rlnName
_rlndatainfo1
_rlndatainfo2
_rlndatainfo3
Name    datainfo1    datainfo2    datainfo3

数据和循环可以忽略的地方,任何带有_rln的东西都是标题,然后所有数据都在下面的行中。

可以有随机数量的列和标题,但这是文件的一般布局。数据并不总是以相同的顺序排列,但总是会正确组织,因为标题中的每一行都是数据字段中的列号。出于这个原因,我想编写一个通用函数,我总是可以使用它来处理这些文件,在这些文件中,我将数据放入数据框中,并循环遍历带有正确标题的每个数据框列的标题。这将让我只索引我需要的任何列,并使处理速度更快。

到目前为止,我只是在尝试遍历标题,以便将它们放在一个列表中为数据框命名,然后找出从哪里开始数据行。

import pandas as pd

data = pd.read_csv('text.txt')

titles = []

for line in data.index:
    if '_rln' in data.iloc[line]:
        titles.append(data.iloc[line])

print(titles)

目前正在创建一个空列表。我一定是在做一些愚蠢的事情,因为我对 pandas 没有太多经验,所以我已经推迟了这么久,所以任何帮助都将不胜感激。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    找到最后一个_rlntitlesline number 然后创建如下数据框

    import pandas as pd
    
    titles = []
    lastrlnLine = 0;
    with open("test3.csv","r") as fi:
        for num, ln in enumerate(fi, 1):
            if ln.startswith("_rln"):
                lastrlnLine = num
                titles.append(ln[4:].rstrip())
    data = pd.read_csv('test3.csv', delimiter='\t', skiprows=lastrlnLine, header=None, names=titles)
    print(data)
    

    【讨论】:

    • skiprows=lastrlnLine+1 然后完美运行。
    【解决方案2】:

    如果所有文件中的字段(列名)都相同,则可以执行以下操作。

    import pandas
    df = None
    titles = list()
    
    with open('test1.csv') as handle:
        while True:
            line = handle.readline()
            if line.startswith('_rln'):
                titles.append(line)
                continue
            if line.startswith('Name'):
                df = pandas.read_csv(handle)
                break
    

    如果它们不相同,那么您应该能够将上面的代码转换为一个函数,您可以在其中更改startswith 行。到预期字段名称的名称。

    【讨论】:

    • 如果您的 _rn* 行始终为 4,那么是的,这将起作用。但如果您希望这适用于任意数量的_rn* 行,则不是。
    【解决方案3】:
    import pandas as pd
    
    
    titles = []
    data = open('txt.txt')
    datalines = data.readlines()
    counter = 0
    for line in range(len(datalines) - 1):
        if '_rln' in datalines[line]:
            var = datalines[line]
            var = var.strip(' \n')
            titles.append(var)
            counter = line
    
    dataframe = pd.read_csv('txt.txt', delim_whitespace=True, skiprows=counter+1, header=None, names=titles)
    

    感谢弗朗西斯王子,我几乎达到了与此答案相同的阶段,但无法弄清楚如何让柜台工作。原来我是超级傻。弗朗西斯王子代码中的所有代码都可以工作,除了skirows需要加1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-19
      • 2022-09-30
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      相关资源
      最近更新 更多