如何从 namedtuple 实例列表创建 pandas DataFrame(带索引或多索引)?

问题描述 投票:0回答:2

简单的例子:

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
的情况下做到这一点?

python pandas dataframe list namedtuple
2个回答
29
投票

要从命名元组中获取系列,您可以使用

_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

0
投票

调用命名元组列表上的 DataFrame 构造函数生成数据框:

df = pd.DataFrame(l)


   ticker        date  price
0      GE  2010-01-01   30.0
1      GE  2010-01-02   31.0

对结果调用

set_index()
会产生所需的输出。但是,由于 OP 不希望这样,另一种方法是将每个命名元组转换为字典和弹出键。

l_asdict = [x._asdict() for x in l]
df = pd.DataFrame(l_asdict, index=pd.MultiIndex.from_arrays([[x.pop(k) for x in l_asdict] for k in ['ticker', 'date']], names=['ticker', 'date']))


                    price
ticker  date    
    GE  2010-01-01   30.0
        2010-01-02   31.0
© www.soinside.com 2019 - 2024. All rights reserved.