Преобразуйте список кортежей в pandas .DataFrame - PullRequest
3 голосов
/ 16 марта 2020

У меня есть три списка кортежей, и первым элементом этих списков является год, как показано ниже.

list1 = [
    ('2010', 1783675.0), ('2011', 1815815.0), ('2012', 1633258.0), ('2013', 1694062.0), ('2014', 1906527.0), 
    ('2015', 1908661.0), ('2016', 2492979.0), ('2017', 2846997.0), ('2018', 2930313.0), ('2019', 2654724.0)
]

list2 = [
    ('2010', 302816.0), ('2011', 229549.0), ('2012', 323063.0), ('2013', 285066.0), ('2014', 282003.0), 
    ('2015', 354500.0), ('2016', 275383.0), ('2017', 322074.0), ('2018', 366909.0), ('2019', 297942.0)
]

list3 =[
    ('2010', 149036.0), ('2011', 144112.0), ('2012', 173944.0), ('2013', 205724.0), ('2014', 214019.0), 
    ('2015', 261462.0), ('2016', 260646.0), ('2017', 279267.0), ('2018', 288120.0), ('2019', 277106.0)
]

Я хочу создать pandas .DataFrame, используя эти списки, устанавливая год в качестве индекса строки:

          list1     list2     list3
2010  1783675.0  302816.0  149036.0
2011  1815815.0  229549.0  144112.0
2012  1633258.0  323063.0  173944.0
2013  1694062.0  285066.0  205724.0
2014  1906527.0  282003.0  214019.0
2015  1908661.0  354500.0  261462.0
2016  2492979.0  275383.0  260646.0
2017  2846997.0  322074.0  279267.0
2018  2930313.0  366909.0  288120.0
2019  2654724.0  297942.0  277106.0

Ответы [ 4 ]

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

Еще один вариант ответов, уже предоставленных: python defaultdict может упростить процесс объединения данных в один словарь перед чтением их в кадр данных:

 from collections import defaultdict
 from itertools import chain

 #chain the lists into one, then
 #get all the similar values into one list:

 d = defaultdict(list)

 for k, v in chain(list1,list2,list3):
     d[k].append(v)

 #read the data into a pandas dataframe:

 df = pd.DataFrame.from_dict(d, orient='index', columns=['list1','list2','list3'])

          list1      list2       list3
2010    1783675.0   302816.0    149036.0
2011    1815815.0   229549.0    144112.0
2012    1633258.0   323063.0    173944.0
2013    1694062.0   285066.0    205724.0
2014    1906527.0   282003.0    214019.0
2015    1908661.0   354500.0    261462.0
2016    2492979.0   275383.0    260646.0
2017    2846997.0   322074.0    279267.0
2018    2930313.0   366909.0    288120.0
2019    2654724.0   297942.0    277106.0
1 голос
/ 16 марта 2020

Вы можете создать новый DataFrame для каждого списка и объединить их, используя метод merge.

import pandas as pd 

list1 = [('2010', 1783675.0), ('2011', 1815815.0), ('2012', 1633258.0), ('2013', 1694062.0),
('2014', 1906527.0),  ('2015', 1908661.0), ('2016', 2492979.0), ('2017', 2846997.0), ('2018', 2930313.0),
 ('2019', 2654724.0)]

list2 = [('2010', 302816.0), ('2011', 229549.0), ('2012', 323063.0), ('2013', 285066.0),
 ('2014', 282003.0), ('2015', 354500.0), ('2016', 275383.0), ('2017', 322074.0), ('2018', 366909.0),
 ('2019', 297942.0)]

list3 =[('2010', 149036.0), ('2011', 144112.0), ('2012', 173944.0), ('2013', 205724.0),
 ('2014', 214019.0), ('2015', 261462.0), ('2016', 260646.0), ('2017', 279267.0), ('2018', 288120.0),
 ('2019', 277106.0)]

df = (pd.DataFrame(data=list1, columns=["year", "list1"])
        .merge(pd.DataFrame(data=list2, columns=["year", "list2"]), on="year")
        .merge(pd.DataFrame(data=list3, columns=["year", "list3"]), on="year"))
0 голосов
/ 16 марта 2020

Другое решение заключается в использовании pandas.concat на pandas.Series, сделанном в течение -1 oop. Код следующий:

series = []

for l, name in [(list1, 'list1'), (list2, 'list2'), (list3, 'list3')]:
    series.append(pd.Series({tup[0]: tup[1] for tup in l}, name=name))

df = pd.concat(series, axis=1)

И результат выглядит так:

>>> print(df)
          list1     list2     list3
2010  1783675.0  302816.0  149036.0
2011  1815815.0  229549.0  144112.0
2012  1633258.0  323063.0  173944.0
2013  1694062.0  285066.0  205724.0
2014  1906527.0  282003.0  214019.0
2015  1908661.0  354500.0  261462.0
2016  2492979.0  275383.0  260646.0
2017  2846997.0  322074.0  279267.0
2018  2930313.0  366909.0  288120.0
2019  2654724.0  297942.0  277106.0
0 голосов
/ 16 марта 2020

Вы можете перебирать списки и создавать словарь в правильном формате, а затем превращать его в DataFrame. Обратите внимание, что это предполагает упорядоченные списки с одинаковыми годами в каждом списке.

import pandas as pd

list1 = [('2010', 1783675.0), ('2011', 1815815.0), ('2012', 1633258.0),
    ('2013', 1694062.0), ('2014', 1906527.0), ('2015', 1908661.0),
    ('2016', 2492979.0), ('2017', 2846997.0), ('2018', 2930313.0),
    ('2019', 2654724.0)]

list2 = [('2010', 302816.0), ('2011', 229549.0), ('2012', 323063.0),
    ('2013', 285066.0), ('2014', 282003.0), ('2015', 354500.0),
    ('2016', 275383.0), ('2017', 322074.0), ('2018', 366909.0),
    ('2019', 297942.0)]

list3 =[('2010', 149036.0), ('2011', 144112.0), ('2012', 173944.0),
    ('2013', 205724.0), ('2014', 214019.0), ('2015', 261462.0),
    ('2016', 260646.0), ('2017', 279267.0), ('2018', 288120.0),
    ('2019', 277106.0)]

df_dict = {}
years = [el[0] for el in list1]

df_dict["list1"] = [el[1] for el in list1]
df_dict["list2"] = [el[1] for el in list2]
df_dict["list3"] = [el[1] for el in list3]

df = pd.DataFrame(df_dict, index=years)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...