Вытащите заголовки из списка и создайте DataFrame с заголовками рядом для элементов списка - PullRequest
0 голосов
/ 09 июня 2018

После очистки веб-сайта я получил список, который выглядит следующим образом:

data = ['\xa0header1', 'element1', 'element2', 'element3', '\xa0header2', 'element4', 'element5']

и т. Д.

Я хочу создать панду с данными, которые я очистилэто выглядит так:

          A         B
   0  element1   header1
   1  element2   header1
   2  element3   header1
   3  element4   header2
   4  element5   header2

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

Как это сделать, учитывая, что специальный символ перед заголовками облегчает поиск их в списке?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Альтернативное решение - использовать collections.defaultdict для создания словаря, отображающего заголовки на элементы.Потенциально более интуитивно, чем itertools.groupby и требует только одного прохода.

from collections import defaultdict
from itertools import chain, repeat

chainer = chain.from_iterable

data = ['\xa0header1', 'element1', 'element2', 'element3',
        '\xa0header2', 'element4', 'element5']

# create dictionary of lists
# each key a separate header; values are list of elements
d = defaultdict(list)

for item in data:
    if item.startswith('\xa0'):
        key = item.strip()
    else:
        d[key].append(item)

# chain list of lists, and use repeat for headers
df = pd.DataFrame({'A': list(chainer(d.values())),
                   'B': list(chainer(repeat(i, j) for i, j in \
                             zip(d.keys(), map(len, d.values()))))})

print(df)

          A        B
0  element1  header1
1  element2  header1
2  element3  header1
3  element4  header2
4  element5  header2
0 голосов
/ 09 июня 2018

itertools groupby + repeat + chain

Это одно решение с использованием модуля itertools.По сути, это единственные операции, которые нам нужно выполнить:

  1. Группировать элементов в зависимости от того, начинаются ли они с \xa0.
  2. Повтор заголовки для каждого списка в вашем списке списков после группировки.
  3. Цепочка результаты для серий A и B для удаления вложенных списков.

Важно отметить, что эти операции уже реализованы в стандартной библиотеке лениво и эффективно, поэтому нет необходимости воспроизводить их на чистом Python (хотя само по себе это хорошее упражнение для обучения).

Полное решение:

from itertools import chain, groupby, repeat

chainer = chain.from_iterable

data = ['\xa0header1', 'element1', 'element2', 'element3',
        '\xa0header2', 'element4', 'element5']

def condition(x):
    return x.startswith('\xa0')

# create list of lists for elements
elements = [list(j) for i, j in groupby(data, key=condition) if not i]

# create list of headers
headers = [next(j) for i, j in groupby(data, key=condition) if i]

# chain list of lists, and use repeat for headers
df = pd.DataFrame({'A': list(chainer(LoL)),
                   'B': list(chainer(repeat(i, j) for i, j in \
                             zip(headers, map(len, elements))))})

print(df)

          A         B
0  element1   header1
1  element2   header1
2  element3   header1
3  element4   header2
4  element5   header2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...