У меня есть текстовый файл следующего формата:

_data

loop_

_rlnName
_rlndatainfo1
_rlndatainfo2
_rlndatainfo3
Name    datainfo1    datainfo2    datainfo3

Если data and loop можно игнорировать, то все, что с _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)

В настоящее время это создает пустой список. Я, должно быть, делаю что-то глупое, я так долго откладывал это, потому что у меня нет большого опыта работы с пандами, поэтому любая помощь будет оценена.

1
j.t.2.4.6 1 Май 2019 в 18:49

3 ответа

Лучший ответ

Найдите titles и line number из последних _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)
0
Prince Francis 1 Май 2019 в 16:39
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)

Спасибо принцу Фрэнсису. Я почти дошел до той же стадии, что и этот ответ, но не мог понять, как заставить счетчик работать. Оказывается, я был супер глупым. Все в коде принца Фрэнсиса работает, кроме скипроуза, нужно добавить 1.

0
j.t.2.4.6 2 Май 2019 в 07:32

Если поля (имена столбцов) одинаковы во всех файлах одинаковы, вы можете сделать что-то вроде следующего.

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. К названию ожидаемых имен полей.

0
aquil.abdullah 1 Май 2019 в 16:23