Home > Software design >  How to transform list from database into dataframe?
How to transform list from database into dataframe?

Time:10-11

I have a following problem. My database returns a list:

[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)]

Every output from the database is a type routes_data_loading.data_structures.Order and datetime.datetime. I would like to save it as a pandas dataframe.

Desired output for the first row is:

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

Semicolumn stands for a new column. Note that the last column time has to be created, because its name is not in the original list.

Can you help me how to convert this list into pandas df, please? I know how to convert simple list into df, but not this complicated one. Thanks a lot.

CodePudding user response:

Try this without guarantee of success:

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)

Output:

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

How do I setup:

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)]
  • Related