我知道我可以通过重置索引来获取DataFrame
的唯一值,但有没有办法避免这一步并直接获取唯一值?
鉴于我有:
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'])
有没有一种内置熊猫的方法来做到这一点?
答案 0 :(得分:34)
一种方法是使用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)
答案 1 :(得分:34)
Andy Hayden的答案(index.levels[blah]
)对某些场景很有用,但可能会导致其他场景出现奇怪的行为。我的理解是,熊猫不遗余力地重复使用"索引尽可能避免使用大量类似索引的DataFrame索引占用内存空间。因此,I've found the following annoying behavior:
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()
我希望这有助于其他人躲避我遇到的超意外行为。
答案 2 :(得分:2)
另一种方法是使用索引的unique()
函数
df.index.unique('B')
与 levels
不同,此函数已记录。