Таким образом, запустив ваш код без ошибок, я получу следующий вывод:
0 1 2 3 4 5
0 1 Start Date str_date B 10 C
1 2 Calculation notional cal_nt C 10 0
2 3 Calculation RATE Today cal_Rate_td C 9 R
Если я воспроизведу код с ошибкой, я фактически получу его в строке перед тем, который вы предложили.
second_field, rest_of_fields = row.split(third_field)
Это происходит из-за разного вывода 'third_fields' в этих двух ситуациях:
third_fields = [e for e in s.split() if '_' in e]
>>['str_date', 'cal_nt', 'cal_Rate_td']
third_fields = [e for e in s.split()]
>>['1', 'Start', 'Date', 'str_date', 'B', '10', 'C', '2', 'Calculation', 'notional', 'cal_nt', 'C', '10', '0', '3', 'Calculation', 'RATE', 'Today', 'cal_Rate_td', 'C', '9', 'R', '10', 'Traea', 'Price', 'price', '2', 'D', '10']
, которые приводят к ошибке, когда вы пытаетесь получить два элемента, используя strip в одном строковом значении.
Если первый фрейм данных - это результаты, которых вы хотите достичь, вы можете воспроизвести его таким образом (не самый красивый код, но вам не нужно регулярное выражение или странные разбиения, и не нужно беспокоиться о строке без '_'):
import pandas as pd
import re
s = '1 Start Date str_date B 10 C \n 2 Calculation notional cal_nt C 10 0\n 3 Calculation RATE Today cal_Rate_td C 9 R\n 10 Traea Price price 2 D 10'
rows = []
for sentence in s.split('\n'):
sent = sentence.split()
first = sent[0]
rest = " ".join(str(x) for x in sent[1:-4])
fourth_last = sent[-4]
third_last = sent[-3]
second_last = sent[-2]
last = sent[-1]
current_row = [first, rest, fourth_last, third_last, second_last, last]
rows.append(current_row)
print(pd.DataFrame(rows))
Out:
0 1 2 3 4 5
0 1 Start Date str_date B 10 C
1 2 Calculation notional cal_nt C 10 0
2 3 Calculation RATE Today cal_Rate_td C 9 R
3 10 Traea Price price 2 D 10