Преобразовать большую строку в кадр данных - PullRequest
0 голосов
/ 21 марта 2020

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

'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....'

, когда в 3-м поле нет '_' Я получаю ошибку 'ValueError: Недостаточно значений для распаковки (ожидается 2, получено 1) 'для разделения String на DataFrame вот мой код:

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'

third_fields = [e for e in s.split() if '_' in e]    

rows = []
for third_field, row in zip(third_fields, s.split('\n')): 
    current_row = []
    row = row.strip()
    first_field = re.search(r'\d+\b', row).group()
    current_row.append(first_field)
    # remove first field
    row = row[len(first_field):].strip()

    second_field, rest_of_fields = row.split(third_field)
    parsed_fields = [e.group() for e in re.finditer(r'\b[\w\d]+\b', rest_of_fields)]
    current_row.extend([second_field, third_field, *parsed_fields])

    rows.append(current_row)


pd.DataFrame(rows)

Я нашел, где мои ошибки кода находятся в строке:

parsed_fields = [e.group() for e in re.finditer(r'\b[\w\d]+\b', rest_of_fields)]

1 Ответ

0 голосов
/ 22 марта 2020

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

   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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...