Как разобрать список списков, чтобы табулировать его? - PullRequest
1 голос
/ 17 марта 2020

У меня есть следующий список, где, когда появляются значения для 'A', 'B' и 'D', это как начало нового блока данных, поскольку значения для 'Q' и 'T' связаны с предыдущие значения «A», «B» и «D».

L1 = [
         ['A','01'],['B','22'],['D','Srt'],
         ['Q','43'],['T','00'],
         ['Q','11'],['T','43'],
         ['A','01'],['B','52'],['D','Polt'],
         ['Q','84'],['T','39'],
         ['A','01'],['B','34'],['D','Jkq'],
         ['Q','81'],['T','13'],
         ['Q','17'],['T','68'],
         ['Q','77'],['T','15']
         ]

На изображении ниже я показываю выходную таблицу, которую я ищу. Я показываю одинаковыми цветами значения «Q» и «T», которые принадлежат значениям A, B и D.

enter image description here

Для второго строка в желтом, я заполняю значения A, B и D (01, 22, Srt)

Для второго и третьего ряда в зеленом, я заполняю значения A, B и D (01, 34, Jkq)

Для строки синего цвета, поскольку существует только одна пара значений для Q и T, то для A, B и D. есть только одна строка.

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

dict = {}
for elem in L1:
    if elem[0] not in dict:
        dict[elem[0]] = []
    dict[elem[0]].append(elem[1:])

>>>
{
'A': [['01'], ['01'], ['01']], 
'B': [['22'], ['52'], ['34']], 
'D': [['Srt'], ['Polt'], ['Jkq']], 
'Q': [['43'], ['11'], ['84'], ['81'], ['17'], ['77']], 
'T': [['00'], ['43'], ['39'], ['13'], ['68'], ['15']]}

Но вывод должен иметь следующую структуру:

Out={
  'A': ['01','01','01','01','01','01'],
  'B': ['22','22','52','34','34','34'],
  'D': ['Srt','Srt','Polt','Jkq','Jkq','Jkq'],
  'Q': ['43','11','84','81','17','77'],
  'T': ['00','43','39','13','68','15'],
}

чтобы сделать pandas.DataFrame(Out)

Как я могу это сделать? спасибо.

ОБНОВЛЕНИЕ

Если список ввода такой:

L1 = [
         ['A','01'],['B','22'],['D','Srt'],
         ['Q','43'],['T','00'],
         ['Q','11'],['T','43'],
         ['A','01'],['B','52'],['D','Polt'],
         ['Q','84'],['T','39'],
         ['A','01'],['B','34'],['D','Jkq'],
         ['Q','81'],['T','13'],
         ['Q','17'],['T','68'],['R','05'],
         ['Q','77'],['T','15']
         ]

Вывод будет выглядеть следующим образом:

Out={
  'A': ['01','01','01','01','01','01'],
  'B': ['22','22','52','34','34','34'],
  'D': ['Srt','Srt','Polt','Jkq','Jkq','Jkq'],
  'Q': ['43','11','84','81','17','77'],
  'T': ['00','43','39','13','68','15'],
  'R': ['','','','','05','']
}

enter image description here

ОБНОВЛЕНИЕ 2

Вот пример входного файла и это код Я использую его для анализа и генерации списка.

import re

f=open("file.txt","r").read().splitlines()

L1=[]
for line in f:
    if re.match(r'[ \t]', line):
        v.append(line.replace(' ', '').split('='))

L1      

В этом файле значения, начинающиеся с нового «блока» и которые необходимо заполнить, всегда A, B, D и E. После E, может быть 6 или 7 значений, которые не нужно заполнять (RDR, VS, RR, SA, GNA, UNA и / или SERRB), если некоторые из этих значений не всегда появляются, оставьте пустым. Таблица вывода в этом случае будет выглядеть следующим образом:

enter image description here

1 Ответ

1 голос
/ 17 марта 2020

Как насчет:

import pandas as pd

L1 = [['A','01'],['B','22'],['D','Srt'],
      ['Q','43'],['T','00'],
      ['Q','11'],['T','43'],
      ['A','01'],['B','52'],['D','Polt'],
      ['Q','84'],['T','39'],
      ['A','01'],['B','34'],['D','Jkq'],
      ['Q','81'],['T','13'],
      ['Q','17'],['T','68'],
      ['Q','77'],['T','15']]

d = {}
li = []
for a,b in L1:
    d[a] = b      # update dictionary as elements are processed
    if a == 'T':  # but append a copy to the list when T is processed.
        li.append(d.copy())

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

Вывод:

    A   B     D   Q   T
0  01  22   Srt  43  00
1  01  22   Srt  11  43
2  01  52  Polt  84  39
3  01  34   Jkq  81  13
4  01  34   Jkq  17  68
5  01  34   Jkq  77  15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...