Как создать 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
после факта?
Ответы
Ответ 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