Python извлечения данных из файла в dataframe - PullRequest
1 голос
/ 20 сентября 2019

У меня есть какой-то общий индекс, импортированный с

f = open(indexfile, "r")

, и в результате получается объект _io.TextIOWrapper, который выглядит следующим образом:

GROUP_FIELD_NAME:ID
GROUP_FIELD_VALUE:1 
GROUP_FIELD_NAME:NAME
GROUP_FIELD_VALUE:Joe 
GROUP_OFFSET:0
GROUP_LENGTH:1234
GROUP_FILENAME:/tmp/something1
GROUP_FIELD_NAME:ID
GROUP_FIELD_VALUE:2 
GROUP_FIELD_NAME:NAME
GROUP_FIELD_VALUE:Jenny 
GROUP_OFFSET:1235
GROUP_LENGTH:12
GROUP_FILENAME:/tmp/something2

Где могут быть некоторые поля данныхизвлекается путем объединения соответствующих _NAME и _VALUE, а некоторые поля просто требуют просмотра имени (_OFFSET, _LENGTH, _FILENAME).Например, просматривая каждую строку и заполняя списки, что-то вроде этого:

Import pandas as pd

ID = []
NAME = []
GROUP_LENGTH = []
GROUP_OFFSET = []
GROUP_FILENAME = []

for line in file:
    if GROUP_OFFSET then add to list
    if GROUP_FIELD_NAME:ID then add GROUP_FIELD_VALUE from next line


a = {'ID': ID,
     'NAME': NAME,
     'GROUP_LENGTH': GROUP_LENGTH,
     'GROUP_OFFSET': GROUP_OFFSET,
     'GROUP_FILENAME': GROUP_FILENAME     
     }

df = pd.DataFrame.from_dict(a, orient='index')

df = df.transpose()

Как мне получить что-то вроде этого:

ID     NAME    GROUP_LENGTH    GROUP_OFFSET    GROUP_FILENAME
1      Joe     1234            0               /tmp/something1
2      Jenny   12              1235            /tmp/something2

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Накопление записей с collections.OrderedDict объектом:

import pandas as pd
from collections import OrderedDict

with open('input.ind') as f:
    records = []
    for line in f:
        name, val = line.strip().split(':')
        if name == 'GROUP_FIELD_NAME':
            if val == 'ID':
                records.append(OrderedDict())
            records[-1][val] = next(f).strip().split(':')[1]
        else:
            records[-1][name] = val

df = pd.DataFrame(records)
print(df)

Выход ожидаемый :

  ID   NAME GROUP_OFFSET GROUP_LENGTH   GROUP_FILENAME
0  1    Joe            0         1234  /tmp/something1
1  2  Jenny         1235           12  /tmp/something2
0 голосов
/ 20 сентября 2019

Если вы хотите получить непосредственно Dataframe, я предлагаю использовать read_csv , с параметром sep , установленным как :.

Теперь вам следуетиметь DataFrame с двумя столбцами: один с именами, а другой со значениями.

Затем вы можете использовать, например, groupby для группировки строк и выполнения некоторых операций по группированию.«Официальный» пример

>>> df = pd.DataFrame({'Animal': ['Falcon', 'Falcon',
...                               'Parrot', 'Parrot'],
...                    'Max Speed': [380., 370., 24., 26.]})
>>> df
   Animal  Max Speed
0  Falcon      380.0
1  Falcon      370.0
2  Parrot       24.0
3  Parrot       26.0
>>> df.groupby(['Animal']).mean()
        Max Speed
Animal
Falcon      375.0
Parrot       25.0

Последний, с transpose, вы можете получить окончательный Dataframe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...