如何获取Pandas数据框的子级索引值?

4

我有一个多层级的数据框 df

>>> df
                   sales     cash
STK_ID RPT_Date                  
000568 20120630   51.926   42.845
       20120930   80.093   57.488
000596 20120630   22.278   18.247
       20120930   32.585   26.177
000799 20120630    9.291    6.513
       20120930   14.784    8.157

我想要获取子级索引'STK_ID'的值列表,它将返回一个列表['000568','000596','000799']
是否有直接的函数来实现这个(不使用reset_index和获取列值)?

1个回答

8
您正在寻找 index.levels
In [10]: df1.index.levels
Out[10]: 
[Index(['000568', '000596', '000799'], dtype=object),
 Int64Index([20120630, 20120930], dtype=int64)]

In [11]: df1.index.levels[0]
Out[11]: Index(['000568','000596','000799'], dtype=object)

请注意,您可以查看索引名称:
In [12]: df1.index.names
Out[12]: ['STK_ID', 'RPT_Date']

这些内容在文档这里有详细介绍。


3
我还发现了 'df.index.get_level_values('STK_ID')',它可以保持值的顺序,而 'df.index.levels[0]' 则输出排序后的列表。 - bigbug
@bigbug 你说得对,你可以使用 df.index.get_level_values('STK_ID').unique() == df.index.levels[0],但是levels存储的就是原样,所以访问速度应该更快 :) - Andy Hayden
1
这都是主观的,但在我的快速%timeit基准测试中,df.index.levels[df.index.names.index(level_name)]每个循环花费6.69微秒,而df.index.get_level_values(level_name).unique()每个循环花费128毫秒。因此,直接获取索引级别对于我的情况来说比后者快了超过19000倍。(我假设我的DataFrame有约500万行,在unique()方法中解析它需要时间) - flutefreak7
@flutefreak7 做计时总是值得的 :) - 原因是这样做要快得多:df.index.get_level_values(level_name)必须从级别构建,然后应用唯一性,因此它至少是O(2n),与IIUC O(1)相比。 - Andy Hayden

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