Как создать pandas DataFrame (с индексом или multiindex) из списка экземпляров namedtuple? - программирование
Подтвердить что ты не робот

Как создать pandas DataFrame (с индексом или multiindex) из списка экземпляров namedtuple?

Простой пример:

>>> from collections import namedtuple
>>> import pandas

>>> Price = namedtuple('Price', 'ticker date price')
>>> a = Price('GE', '2010-01-01', 30.00)
>>> b = Price('GE', '2010-01-02', 31.00)
>>> l = [a, b]
>>> df = pandas.DataFrame.from_records(l, index='ticker')
Traceback (most recent call last)
...
KeyError: 'ticker'

Более жесткий пример:

>>> df2 = pandas.DataFrame.from_records(l, index=['ticker', 'date'])
>>> df2

         0           1   2
ticker  GE  2010-01-01  30
date    GE  2010-01-02  31

Теперь он считает, что ['ticker', 'date'] является самим индексом, а не столбцами, которые я хочу использовать в качестве индекса.

Есть ли способ сделать это, не прибегая к промежуточному numpy ndarray или используя set_index после факта?

4b9b3361

Ответ 1

Чтобы получить серию из namedtuple, вы можете использовать атрибут _fields:

In [11]: pd.Series(a, a._fields)
Out[11]:
ticker            GE
date      2010-01-01
price             30
dtype: object

Аналогичным образом вы можете создать DataFrame следующим образом:

In [12]: df = pd.DataFrame(l, columns=l[0]._fields)

In [13]: df
Out[13]:
  ticker        date  price
0     GE  2010-01-01     30
1     GE  2010-01-02     31

После факта вы должны set_index, но вы можете сделать это inplace:

In [14]: df.set_index(['ticker', 'date'], inplace=True)

In [15]: df
Out[15]:
                   price
ticker date
GE     2010-01-01     30
       2010-01-02     31