50

我知道我可以DataFrame通过重置索引来获取 a 的唯一值,但是有没有办法避免这一步并直接获取唯一值?

鉴于我有:

        C
 A B     
 0 one  3
 1 one  2
 2 two  1

我可以:

df = df.reset_index()
uniq_b = df.B.unique()
df = df.set_index(['A','B'])

有没有内置熊猫的方法来做到这一点?

4

3 回答 3

44

一种方法是使用index.levels

In [11]: df
Out[11]: 
       C
A B     
0 one  3
1 one  2
2 two  1

In [12]: df.index.levels[1]
Out[12]: Index([one, two], dtype=object)
于 2012-12-15T01:46:22.580 回答
43

Andy Hayden 的答案 ( index.levels[blah]) 在某些情况下非常有用,但在其他情况下可能会导致奇怪的行为。我的理解是,Pandas 会尽可能地“重用”索引,以避免大量索引相似的 DataFrame 的索引占用内存空间。结果,我发现了以下烦人的行为

import pandas as pd
import numpy as np

np.random.seed(0)

idx = pd.MultiIndex.from_product([['John', 'Josh', 'Alex'], list('abcde')], 
                                 names=['Person', 'Letter'])
large = pd.DataFrame(data=np.random.randn(15, 2), 
                     index=idx, 
                     columns=['one', 'two'])
small = large.loc[['Jo'==d[0:2] for d in large.index.get_level_values('Person')]]

print small.index.levels[0]
print large.index.levels[0]

哪个输出

Index([u'Alex', u'John', u'Josh'], dtype='object')
Index([u'Alex', u'John', u'Josh'], dtype='object')

而不是预期的

Index([u'John', u'Josh'], dtype='object')
Index([u'Alex', u'John', u'Josh'], dtype='object')

正如一个人在另一线程上指出的那样,一个看起来很自然且工作正常的成语是:

small.index.get_level_values('Person').unique()
large.index.get_level_values('Person').unique()

我希望这可以帮助其他人避开我遇到的超级意外行为。

于 2014-06-30T11:38:56.107 回答
4

另一种方法是使用unique()索引功能

df.index.unique('B')

levels此功能不同的是记录在案。

于 2021-01-20T05:54:47.327 回答