Мой исходный тестовый файл выглядит следующим образом:
r0 xxxx
r1 xxxx, yyy
r2 xxxx, zzz
--------
r3 xxxx
r4 xxxx
--------
r6 xxxx
Первый шаг - прочитать его с несуществующим разделителем (я выбрал '&' ), чтобы каждыйисходная строка - это содержимое поля single (я назвал его line ):
df = pd.read_csv('Input.txt', sep='&', names=['line'])
Следующим шагом является добавление столбца «группировки» в такое поле. способ, которым его значение увеличивается в каждой «точке контакта» между строкой, начинающейся с '----' (конец предыдущей «логической строки»), и следующей строкой, начинающейся с некоторого другого текста(начало следующей «логической строки»):
df['grp'] = (~df.line.str.startswith('----') & df.line.shift(fill_value='')\
.str.startswith('----')).cumsum()
Результат для моих данных:
line grp
0 r0 xxxx 0
1 r1 xxxx, yyy 0
2 r2 xxxx, zzz 0
3 -------- 0
4 r3 xxxx 1
5 r4 xxxx 1
6 -------- 1
7 r6 xxxx 2
Следующим шагом является определение функции, генерирующей Серия строк, но без завершения '----' , из группы исходных строк:
def genRow(gr):
return gr.loc[~gr.line.str.startswith('----'), 'line'].reset_index(drop=True)
Последний шаг ( reset_index ) было добавлено, чтобы индекс в результате всегда начинался с 0. Таким образом, когда результаты применения этой функции будут объединены, последовательные члены каждой группыup будет помещаться в последовательные столбцы, начиная с 0.
И для генерации конечного результата:
- применить эту функцию к каждой группе,
- unstack для создания DataFrame,
- имя индекса удаления ( rename_axis ),
- замена NaN s на пустые строки ( fillna).
Код для этого:
df2 = df.groupby('grp').apply(genRow).unstack(level=1).rename_axis('').fillna('')
Таким образом, мы получили:
0 1 2
0 r0 xxxx r1 xxxx, yyy r2 xxxx, zzz
1 r3 xxxx r4 xxxx
2 r6 xxxx
Как видите:
- Этот код работает, даже если в некоторых «логических строках» число строк (преобразованных в столбцы) меньше.
- Любая строка может содержать, например, запятую, которая не разделяетИсходный текст в смежные поля.
В качестве последнего шага вы можете установить атрибут columns этого DataFrame, чтобы иметь имена столбцов по вашему желанию.