Данные - это столбец, содержащий заголовки и подразделы, как их разбить? - PullRequest
0 голосов
/ 17 октября 2018

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

'A[title]'
'a'
'b'
'c'
'B[title]'
'd'
'C[title]'
'e'
'f'
...

Где каждый блок отделяется заголовком, помеченным 'title'.Мне нужно разделить эти блоки и отформатировать их следующим образом:

'A[title]' ,'a'
'A[title]' ,'b'
'A[title]' ,'c'
'B[title]' ,'d'
'C[title]' ,'e'
'C[title]' ,'f'
...

В настоящее время я использую цикл for для выполнения работы, мой код выглядит следующим образом:

data=pd.Series(data)

newd = []
for i in data.index:
    if '[' not in data[i]:
        current_title = data[i]
    else:
        newd.append([current_title,data[i]])

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

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Для чисто Python-решения вы можете использовать itertools.groupby:

from itertools import groupby

L = ['A[title]', 'a', 'b', 'c', 'B[title]', 'd', 'C[title]', 'e', 'f']

grouper = groupby(L, key=lambda x: x.endswith('[title]'))
g = [list(b) for _, b in grouper]
res = [[i[0], k] for i, j in zip(g[::2], g[1::2]) for k in j]

print(res)

[['A[title]', 'a'], ['A[title]', 'b'], ['A[title]', 'c'],
 ['B[title]', 'd'], ['C[title]', 'e'], ['C[title]', 'f']]

Пояснение

  1. Группировать построка оканчивается на [title].
  2. Извлечение результатов в виде списка для последующей нарезки.
  3. Извлечение нечетных элементов в виде заголовков и четных элементов в виде имен с помощью понимания вложенного списка с помощью zip.
0 голосов
/ 17 октября 2018

Вы можете сделать это с str.contains и ffill

data=data.to_frame('ori')
data['title']=data.ori[data.ori.str.contains('title')]
data=data.ffill().loc[lambda x : x.ori!=x.title]
data
Out[499]: 
  ori     title
1   a  A[title]
2   b  A[title]
3   c  A[title]
5   d  B[title]
7   e  C[title]
8   f  C[title]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...