在Pandas Series索引中添加一个级别

5
我尝试给 Pandas Series 添加一个级别。假设我创建了一个简单的 Series:
 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`现在具有两个级别的多重索引。
是否有更简单、更干净的方法?
2个回答

4

我不确定这个方法是否更加清晰易懂;可以使用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()这样的输出结果。 - Tim Hopper

4

一种简单的方法(原地操作)是:

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

编辑 还有另一种方式可以完成相同的操作(非原地操作):

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


虽然这个链接可能回答了问题,但仅提供链接的答案在 Stack Overflow 上是不被鼓励的。您可以通过提取链接中的重要部分并将其放入您的答案中来改进此答案,这样可以确保如果链接被更改或删除,您的答案仍然是一个完整的答案 :) - WhatsThePoint
1
series2.index = pd.concat([series], keys=['L2']).index 这个方法有什么问题吗? - BallpointBen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接