2013-06-08 8 views
14

Semplice esempio:Come posso creare un DataFrame panda (con indice o multiindice) dall'elenco delle istanze 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' 

Harder esempio:

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

Ora pensa che ['ticker', 'date'] è l'indice stesso, piuttosto che le colonne che voglio usare come indice.

C'è un modo per farlo senza ricorrere a un numpy ndarray intermedio o utilizzando set_index dopo il fatto?

risposta

18

Per ottenere una serie da un namedtuple è possibile utilizzare l'attributo _fields:

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

Allo stesso modo è possibile creare un dataframe come questo:

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 

Devi set_index dopo il fatto, ma lo puoi fare 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 
+0

Intelligente. Non avevo realizzato che esistesse un attributo _fields su namedtuples. Potrebbe essere utile aprire un ticket per supportare la costruzione di namedtuples nello stesso modo in cui i dizionari funzionano ora. –

+0

Ho qualcosa insieme, ma penso che questo metodo sia probabilmente buono per la maggior parte dei casi d'uso ... –

+0

Non penso che ci sia un giro intorno a 'set_index', ma è possibile farlo all'interno. –

Problemi correlati