Переход из длинного списка строк в фрейм данных Pandas

#python #pandas

#python #pandas

Вопрос:

У меня есть прайс-лист в формате pdf, который я импортировал в список. Формат таков, что мой список выглядит как в примере ниже.

 sample = ['model description price model description price 39A Bolt 25.00 21B valve 322.40 AB3003 Engine  5000n20B Nut 1.50 25B LockNut 3.50',
          'model description price  model description price 44C Spanner 100.00 01BC Pipe 3.10 ZZ010  Blade  345.44n33J Tube 8.89 377GH CAM 44.20']
 

Для каждого элемента списка «цена описания модели» всегда повторяется один раз, а затем следуют фактические данные. Для каждого элемента списка существует до 20 последовательностей модели / описания / цены фактических данных.

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

 data={'model':['39A','21B','AB3003','20B','25B','44C','01BC','ZZ010','33J','377GH'], 
      'description': ['Bolt', 'valve', 'engine','nut','locknut', 'spanner','pipe','blade','tube','cam'],
     'price': [25.00,322.40,5000,1.50,3.50,100.00,3.10,345.44,8.89,44.20]}
pd.DataFrame(data)
 

Желаемый результат

Я попробовал следующее, чтобы, по крайней мере, разделить каждый элемент исходного списка на вложенный список

 sample2 = [i.split(' ') for i in sample]
pd.DataFrame(sample2)
 

но результат не похож на фрейм данных, который я ищу.

Кто-нибудь может мне помочь, пожалуйста?

Спасибо

Ответ №1:

Это то, что я написал, что будет работать для предоставленного вами примера:

 import re, pdb
import pandas as pd
sample = ['model description price model description price 39A Bolt 25.00 21B valve 322.40 AB3003 Engine  5000n20B Nut 1.50 25B LockNut 3.50',
          'model description price  model description price 44C Spanner 100.00 01BC Pipe 3.10 ZZ010  Blade  345.44n33J Tube 8.89 377GH CAM 44.20']

DF_list = []

#remove 'model description price'
remove_str = lambda sub_str, some_str: re.sub(r'b'   sub_str   r'b', '', some_str)
sample = [remove_str('model description price', x).strip() for x in sample]

#remove newline
sample = [re.split(r'[nt]', line) for line in sample]
sample = [item for sublist in sample for item in sublist]


#parse into data frame
for data_string in sample:
  data_list = data_string.split(' ')
  data_list = [x for x in data_list if x != '']
  small_lists = [data_list[x:x 3] for x in range(0, len(data_list), 3)]
  [DF_list.append(x) for x in small_lists]

DF = pd.DataFrame(DF_list)