Pandas:按实验室获取唯一的多索引级别值

2024-06-26 11:02:39 发布

您现在位置:Python中文网/ 问答频道 /正文

假设您有这个多索引ed数据帧:

df = pd.DataFrame({'co':['DE','DE','FR','FR'],
                   'tp':['Lake','Forest','Lake','Forest'],
                   'area':[10,20,30,40],
                   'count':[7,5,2,3]})
df = df.set_index(['co','tp'])

看起来是这样的:

           area  count
co tp
DE Lake      10      7
   Forest    20      5
FR Lake      30      2
   Forest    40      3

我想检索每个索引级别的唯一值。这可以通过使用

df.index.levels[0]  # returns ['DE', 'FR]
df.index.levels[1]  # returns ['Lake', 'Forest']

我真正想做的是通过按级别的名称来检索这些列表,即'co''tp'。我能找到的最短两条路是这样的:

list(set(df.index.get_level_values('co')))  # returns ['DE', 'FR']
df.index.levels[df.index.names.index('co')]  # returns ['DE', 'FR']

但没有一个非常优雅。有较短的路吗?


Tags: dfindexcountdeareafr级别returns
3条回答

我想您需要在多索引的某个级别(以及按级别名称)中使用唯一值。我通常做以下的,这有点长。

In [11]: df.index.get_level_values('co').unique()
Out[11]: array(['DE', 'FR'], dtype=object)

Pandas 0.23.0终于introduced解决这个问题的一个更清晰的解决方案:对Index.unique()level参数:

In [3]: df.index.unique(level='co')
Out[3]: Index(['DE', 'FR'], dtype='object', name='co')

这是现在推荐的解决方案。它的效率更高,因为它避免了在内存中创建级别值的完整表示,并重新扫描它。

另一种方法是通过调用df.index.levels[level_index]来查找级别数,其中可以从df.index.names.index(level_name)推断级别索引。在上面的示例中,level_name='co'。

@Happy001提出的答案计算出了唯一的,可能需要大量计算。

相关问题 更多 >