Python 使用文本文件中的标题信息组织数据帧

Python 使用文本文件中的标题信息组织数据帧,python,pandas,Python,Pandas,我有一个以下格式的文本文件: _data loop_ _rlnName _rlndatainfo1 _rlndatainfo2 _rlndatainfo3 Name datainfo1 datainfo2 datainfo3 在可以忽略数据和循环的地方,任何带有_rln的内容都是标题,然后所有数据都在下面的行中 可以有任意数量的列和标题,但这是文件的总体布局。数据的顺序并不总是相同的,但总是正确组织,因为标题中的每一行都是数据字段中的列号。出于这个原因,我想编写一个通用函

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

_data

loop_

_rlnName
_rlndatainfo1
_rlndatainfo2
_rlndatainfo3
Name    datainfo1    datainfo2    datainfo3
在可以忽略数据和循环的地方,任何带有_rln的内容都是标题,然后所有数据都在下面的行中

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

到目前为止,我只是尝试循环浏览标题,这样我就可以在一个列表中找到它们,为数据帧命名,然后找出数据行的起始位置

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)
目前,这正在创建一个空列表。我一定是做了什么蠢事,我已经推迟了这么久,因为我没有太多的熊猫经验,所以任何帮助都将不胜感激。

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

导入熊猫
df=无
标题=列表()
以open('test1.csv')作为句柄:
尽管如此:
line=handle.readline()
如果行开始使用(“u rln”):
标题.附加(行)
持续
如果line.startswith('Name'):
df=pandas.read_csv(句柄)
打破
如果它们不相同,那么您应该能够将上面的代码转换为一个函数,在该函数中您可以更改
startswith
行。如果所有文件中的字段(列名)都相同,则可以执行以下操作

导入熊猫
df=无
标题=列表()
以open('test1.csv')作为句柄:
尽管如此:
line=handle.readline()
如果行开始使用(“u rln”):
标题.附加(行)
持续
如果line.startswith('Name'):
df=pandas.read_csv(句柄)
打破

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

查找上次
\n的
标题和
行号
然后创建数据框,如下所示

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)

查找最后一个
标题
行号
\u rln
然后创建数据框,如下所示

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需要增加1


感谢弗朗西斯王子,我几乎达到了这个回答的相同阶段,但不知道如何让计数器工作。原来我太傻了。弗朗西斯王子代码中的所有内容都可以工作,除了skiprows需要添加1。

如果您的
\n*
行始终是第4行,那么是的,这将工作。但是,如果您希望此操作适用于任意数量的
\u rn*
行,则情况并非如此。如果您的
\u rn*
行始终是第4行,则可以。但是,如果您希望它可以处理任意数量的
\u rn*
行,则不会这样做。skiprows=lastrlnLine+1,则此操作非常有效。skiprows=lastrlnLine+1,则此操作非常有效。