【问题标题】:How to index with a list of values with only one label in a Pandas MultiIndex如何使用 Pandas MultiIndex 中只有一个标签的值列表进行索引
【发布时间】:2012-04-18 13:31:32
【问题描述】:

我正在尝试使用 pandas 多索引在顶级索引(日期)处选择部分切片,并将列表应用于二级索引(股票代码)。 IE。下面我想要d1:d2 范围内的 AAPL 和 MSFT 的数据。

部分切片工作正常,但不清楚如何从第二个索引中选择 AAPL 和 MSFT,同时避免中间的 GOOG。

如果我交换级别,它可以使用单个符号,而不是列表。

In [93]: print df
                 f1  f2  c1
date       sym
2012-01-01 AAPL  5.  2   3
           GOOG  1.  2   3
           MSFT  4.  2   3
2012-01-02 AAPL  8.  2   3
           GOOG  6.  2   3
           MSFT  7.  2   3
2012-01-03 AAPL  11  2   3
           GOOG  9.  2   3
           MSFT  10  2   3

In [94]: print df.ix[d1:d2].swaplevel(0,1).ix['AAPL']
            f1  f2  c1
date
2012-01-01  5   2   3
2012-01-02  8   2   3

In [95]: print df.ix[d1:d2].swaplevel(0,1).ix[['AAPL', 'MSFT']]
<blah balh>
TypeError: Expected tuple, got str

我想避免建立一个长的元组列表,即:

t = [(d1, 'AAPL'), (d1, 'MSFT'), (d2, 'AAPL'), (d2, 'MSFT')]

当传递给 ix 时会起作用。以下是我想要的输出。

In [103]: print df.ix[t]
                 f1  f2  c1
date       sym
2012-01-01 AAPL  5   2   3
           MSFT  4   2   3
2012-01-02 AAPL  8   2   3
           MSFT  7   2   3

谢谢, 约翰

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    它适用于我的 pandas 0.7.2:

    print df.ix[d1:d2].swaplevel(0,1).ix[['AAPL', 'MSFT']]
                     f1  f2  c1
    sym  date                  
    AAPL 2012-01-01   5   2   3
    MSFT 2012-01-01   4   2   3
    AAPL 2012-01-02   8   2   3
    MSFT 2012-01-02   7   2   3
    
    import pandas; pandas.__version__
    '0.7.2'
    

    【讨论】:

    • 是的,这是在 0.7.0 和 0.7.2 之间实现的。
    猜你喜欢
    • 1970-01-01
    • 2020-05-20
    • 2013-07-29
    • 1970-01-01
    • 2017-10-12
    • 2023-02-03
    • 1970-01-01
    • 2014-01-12
    • 2018-12-20
    相关资源
    最近更新 更多