Как преобразовать список из базы данных в фрейм данных?

#python #pandas #database

Вопрос:

У меня есть следующая проблема. Моя база данных возвращает список:

 [Order(id=22617, frm=datetime.datetime(2020, 6, 1, 8, 0), to=datetime.datetime(2020, 6, 1, 10, 0), loc=Location(lat=14.491272455461, lng=50.130463596998), address='Makedonska 619/11, Praha', duration=600), datetime.datetime(2020, 6, 1, 11, 38, 46), Order(id=22615, frm=datetime.datetime(2020, 6, 1, 8, 0), to=datetime.datetime(2020, 6, 1, 14, 0), loc=Location(lat=14.681866313487, lng=50.007439571346), address='Výhledová 256, Říčany', duration=600), datetime.datetime(2020, 6, 1, 10, 33, 33)]
 

Каждый вывод из базы данных является типом routes_data_loading.data_structures.Order и datetime.datetime . Я хотел бы сохранить его как фрейм данных pandas.

Желаемый результат для первой строки:

 id;frm;to;lat;lng;address;duration;time
22617;2020-06-01 08:00;2020-06-01 10:00;14.491272455461;50.130463596998;Makedonska 619/11, Praha;600;2020-06-01 11:38:46
 

Точка с запятой обозначает новый столбец. Обратите внимание, что необходимо создать последний столбец time , поскольку его имени нет в исходном списке.

Не могли бы вы помочь мне, как преобразовать этот список в pandas df, пожалуйста? Я знаю, как преобразовать простой список в df, но не этот сложный. Большое спасибо.

Комментарии:

1. Попробуйте, если lst[0].__dict__ что-то верните.

2. Это помогло, спасибо!

Ответ №1:

Попробуйте это без гарантии успеха:

 data = []
for order, time in zip(lst[::2], lst[1::2]):
    data.append({'id': order.id, 'frm': order.frm, 'to': order.to,
                 'lat': order.loc.lat, 'lng': order.loc.lng,
                 'address': order.address, 'duration': order.duration, 
                 'time': time})

df = pd.DataFrame(data)
 

Выход:

 >>> df
      id                 frm                  to        lat        lng                   address  duration                time
0  22617 2020-06-01 08:00:00 2020-06-01 10:00:00  14.491272  50.130464  Makedonska 619/11, Praha       600 2020-06-01 11:38:46
1  22615 2020-06-01 08:00:00 2020-06-01 14:00:00  14.681866  50.007440     Výhledová 256, Říčany       600 2020-06-01 10:33:33
 

Как мне настроить:

 from collections import namedtuple
import datetime

Order = namedtuple('Order', ['id', 'frm', 'to', 'loc', 'address', 'duration'])
Location = namedtuple('Location', ['lat', 'lng'])

lst = [Order(id=22617, frm=datetime.datetime(2020, 6, 1, 8, 0), to=datetime.datetime(2020, 6, 1, 10, 0), loc=Location(lat=14.491272455461, lng=50.130463596998), address='Makedonska 619/11, Praha', duration=600),
       datetime.datetime(2020, 6, 1, 11, 38, 46),
       Order(id=22615, frm=datetime.datetime(2020, 6, 1, 8, 0), to=datetime.datetime(2020, 6, 1, 14, 0), loc=Location(lat=14.681866313487, lng=50.007439571346), address='Výhledová 256, Říčany', duration=600),
       datetime.datetime(2020, 6, 1, 10, 33, 33)]
 

Комментарии:

1. работает отлично, спасибо!

2. Вау. Рад это прочесть. Я не был уверен в своем ответе 🙂 Спасибо за вашу поддержку!