Преобразовать большую строку в Dataframe - PullRequest
1 голос
/ 21 марта 2020

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

'1 Дата начала str_date B 10 C \ n 2 Расчет условный cal_nt C 10 0 \ n 3 Расчет RATE Today cal_Rate_td C 9 R \ n .... '

проблема в том, что я не могу использовать один или два пробела, чтобы разделить мою строку, потому что от даты начала до str_date есть 2 пробела, но в следующей строке будет 3 для пример и, возможно, в следующей строке будет 1 пробел для разделения ... это очень затрудняет создание правильного DataFrame, как я хочу, есть ли способ для этого? спасибо

Ответы [ 2 ]

1 голос
/ 21 марта 2020

, чтобы получить список со всеми словами, которые имеют _ (как вы и просили в комментариях), вы можете использовать регулярное выражение:

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

list(map(re.Match.group, re.finditer(r'\w+_.\w+', s)))

output:

['str_date', 'cal_nt', 'cal_Rate_td']

или вы можете использовать понимание списка:

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

вывод:

['str_date', 'cal_nt', 'cal_Rate_td']

, чтобы получить фрейм данных из вашей строки, вы можете использовать вышеуказанную информацию, третье поле :

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

выход:

enter image description here

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

Как и @ kederra c ответ, вы можете использовать регулярные выражения, чтобы разделить их

import re
s = "1 Start Date str_date  B  10   C "
l = re.compile("\s+").split(s.strip()) 
# output ['1', 'Start', 'Date', 'str_date', 'B', '10', 'C']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...