【问题标题】:How to resort a MultiIndex DataFrame by second level如何在二级上使用 MultiIndex DataFrame
【发布时间】:2017-06-13 21:59:39
【问题描述】:

我有一个DataFrame 和一个MultiIndex。索引字段为OptionSymbol(0 级)和QuoteDatetime(1 级)。我已经对DataFrame 进行了索引和排序,如下所示:

sorted = df.sort_values(
    ['OptionSymbol', 'QuoteDatetime'], 
    ascending=[False, True]
)

indexed = sorted.set_index(
    ['OptionSymbol', 'QuoteDatetime'],
    drop=True
)

这会导致以下结果:

                                      Id  Strike Expiration OptionType
OptionSymbol       QuoteDatetime                                      
ZBYMZ              2013-09-02     234669   170.0 2011-01-22        put
                   2013-09-03     234901   170.0 2011-01-22        put
                   2013-09-04     235133   170.0 2011-01-22        put
  ...                     ...        ...     ...        ...        ...
YBWNA              2010-02-12     262202    95.0 2010-02-20       call
                   2010-02-16     262454    95.0 2010-02-20       call
                   2010-02-17     262707    95.0 2010-02-20       call
  ...                     ...        ...     ...        ...        ...
XWNAX              2012-07-12     262201    90.0 2010-02-20       call
                   2012-07-16     262453    90.0 2010-02-20       call
                   2012-07-17     262706    90.0 2010-02-20       call
  ...                     ...        ...     ...        ...        ...
WWWAX              2012-04-12     262201    90.0 2010-02-20       call
                   2012-04-16     262453    90.0 2010-02-20       call
                   2012-04-17     262706    90.0 2010-02-20       call
  ...                     ...        ...     ...        ...        ...

正如预期的那样,框架首先按OptionSymbol 的降序和升序OptionSymbol 组中排序

我需要做的是现在使用QuoteDatetime 中的第一个值,所以结果如下所示:

                                      Id  Strike Expiration OptionType
OptionSymbol       QuoteDatetime                                      
XBWNA              2010-02-12     262202    95.0 2010-02-20       call
                   2010-02-16     262454    95.0 2010-02-20       call
                   2010-02-17     262707    95.0 2010-02-20       call
  ...                     ...        ...     ...        ...        ...
NWWAX              2012-04-12     262201    90.0 2010-02-20       call
                   2012-04-16     262453    90.0 2010-02-20       call
                   2012-04-17     262706    90.0 2010-02-20       call
  ...                     ...        ...     ...        ...        ...
BWNAX              2012-07-12     262201    90.0 2010-02-20       call
                   2012-07-16     262453    90.0 2010-02-20       call
                   2012-07-17     262706    90.0 2010-02-20       call
  ...                     ...        ...     ...        ...        ...
XBYMZ              2013-09-02     234669   170.0 2011-01-22        put
                   2013-09-03     234901   170.0 2011-01-22        put
                   2013-09-04     235133   170.0 2011-01-22        put
  ...                     ...        ...     ...        ...        ...

我已经尝试了各种通过 index=1 进行求助的方法,但后来我失去了OptionSymbol 组。我该怎么做?

使用代码编辑以重新创建

from collections import OrderedDict
df = OrderedDict((
    ('OptionSymbol', pd.Series(['ZBYMZ', 'ZBYMZ', 'ZBYMZ', 'YBWNA', 'YBWNA', 'YBWNA', 'XWNAX', 'XWNAX', 'XWNAX', 'WWWAX', 'WWWAX', 'WWWAX', ])),
    ('QuoteDatetime', pd.Series(['2013-09-02', '2013-09-03', '2013-09-04', '2010-02-12', '2010-02-16', '2010-02-17', '2012-07-12', '2012-07-16', '2012-07-17', '2012-04-12', '2012-04-16', '2012-04-17'])),
    ('Id', pd.Series(np.random.randn(12,))),
    ('Strike', pd.Series(np.random.randn(12,))),
    ('Expiration', pd.Series(np.random.randn(12,))),
    ('OptionType', pd.Series(np.random.randn(12,)))
))

在这种情况下使用df.sort_index(level=1) 很奇怪,但是在我的完整数据集(20 多列)上,我丢失了OptionSymbol 分组。

【问题讨论】:

  • 最好以易于复制和粘贴的格式提供示例数据。从我自己的角度来看,我不想浪费时间输入您拥有的数据或做任何其他事情来复制您的数据。我的 2 美分。
  • 好点。这来自一个不容易复制的数据库。
  • @JasonStrimpel,您能否提供可重现数据集(输入和所需数据集)?目前还不是很清楚...
  • 使用重新创建的代码进行编辑,尽管@MaxU 的简单答案似乎在原始数据 (100_000_000 x 20) 中有效,但我失去了 OptionSymbol 分组。
  • 天啊,我发现数据库出现数据问题。 OptionSymbol 实际上改变了格式,这打破了第一类。 @MaxU 是对的

标签: python sorting pandas dataframe multi-index


【解决方案1】:

IIUC 你可以简单地按二级排序索引:

In [27]: df.sort_index(level=1)
Out[27]:
                                Id  Strike  Expiration OptionType
OptionSymbol QuoteDatetime
YBWNA        2010-02-12     262202    95.0  2010-02-20       call
             2010-02-16     262454    95.0  2010-02-20       call
             2010-02-17     262707    95.0  2010-02-20       call
WWWAX        2012-04-12     262201    90.0  2010-02-20       call
             2012-04-16     262453    90.0  2010-02-20       call
             2012-04-17     262706    90.0  2010-02-20       call
XWNAX        2012-07-12     262201    90.0  2010-02-20       call
             2012-07-16     262453    90.0  2010-02-20       call
             2012-07-17     262706    90.0  2010-02-20       call
ZBYMZ        2013-09-02     234669   170.0  2011-01-22        put
             2013-09-03     234901   170.0  2011-01-22        put
             2013-09-04     235133   170.0  2011-01-22        put

【讨论】:

    猜你喜欢
    • 2013-01-22
    • 2021-06-18
    • 2017-12-21
    • 2019-09-04
    • 1970-01-01
    • 2019-02-16
    • 2021-10-20
    相关资源
    最近更新 更多