【问题标题】:Appending a level to a Pandas Series Index将级别附加到 Pandas 系列索引
【发布时间】:2013-10-29 15:48:15
【问题描述】:

我正在尝试将关卡附加到 Pandas 系列。说创建一个简单的系列:

 series = pd.Series(range(10), index = list("ABCDEFGHIJ"))

series 有一个索引级别。我想添加第二个级别。使用 DataFrame,您可以使用 DataFrame.set_index 稍微干净地执行此操作。但是,如果不先将我的系列转换为 DataFrame,我想出的最简单的方法是:

 index =  [np.array(["L2" for x in series.index]), np.array(series.index)]     
 series2 = pd.Series(series.tolist(), index = index)

series2 现在有一个具有两个级别的多索引。

有没有更简单和更清洁的方法?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    不确定这是否更干净;有一个MultiIndex 类可用于构造分层索引:

    >>> import pandas as pd
    >>> series = pd.Series(range(10), index = list("ABCDEFGHIJ"))
    

    创建一个新对象,重用原来的series索引:

    >>> pd.Series(xrange(10), 
                  pd.MultiIndex.from_tuples([('L2', a) for a in series.index]))
    L2  A    0
        B    1
        C    2
        D    3
        E    4
        F    5
        G    6
        H    7
        I    8
        J    9
    dtype: int64
    

    或者也可以就地更改系列:

    >>> import pandas as pd
    >>> series = pd.Series(range(10), index = list("ABCDEFGHIJ"))
    >>> series.index = pd.MultiIndex.from_tuples([('L2', a) for a in series.index])
    

    或者直接以MultiIndex 开头:

    >>> import pandas as pd
    >>> series = pd.Series(range(10), index=pd.MultiIndex.from_tuples(
                                            [('L2', x) for x in 'ABCDEFGHIJ']))
    

    【讨论】:

    • 谢谢@miku。这很有帮助。我通常不会使用构造函数来构造这些系列,否则最后一个想法会是最好的;它们是 value_counts() 之类的输出。
    【解决方案2】:

    一个简单的方法(就地)是:

    series.index = pd.MultiIndex.from_product([['L2'], series.index])

    编辑还有另一种方法可以做同样的事情(不是就地):

    series2 = pd.concat([series], keys=['L2'])

    【讨论】:

    • 虽然此链接可能会回答问题,但 Stack Overflow 上不鼓励仅链接的答案,您可以通过获取链接的重要部分并将其放入您的答案来改进此答案,这样可以确保您的答案是如果链接被更改或删除,仍然是一个答案:)
    • 任何原因series2.index = pd.concat([series], keys=['L2']).index 不起作用?
    猜你喜欢
    • 2014-05-02
    • 2016-12-27
    • 2020-05-19
    • 2018-11-09
    • 2016-09-17
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    相关资源
    最近更新 更多