我知道我可以通過重置索引來獲取DataFrame
的唯一值,但有沒有辦法避免這一步並直接獲取唯一值?從MultiIndex索引列中獲取唯一值
鑑於我:
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'])
有建於大熊貓的方式做到這一點?
我知道我可以通過重置索引來獲取DataFrame
的唯一值,但有沒有辦法避免這一步並直接獲取唯一值?從MultiIndex索引列中獲取唯一值
鑑於我:
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'])
有建於大熊貓的方式做到這一點?
一種方法是使用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)
適合我。謝謝! – seth
這是一個很好的答案,但它在一些特定情況下有一些非常奇怪的行爲。請看下面的答案,以避免這些問題。 – 8one6
這對我不起作用。索引不再具有屬性級別。這是更新嗎? – eleijonmarck
安迪·海登的答案(index.levels[blah]
)是偉大的一些場景,但會導致其他奇怪的行爲。我的理解是,熊貓在儘可能「重複使用」索引時儘量避免使用大量類似索引的數據幀索引佔用內存空間。其結果是,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()
我希望這可以幫助別人躲避我遇到的超級意外的行爲。
FWIW,這是如果試圖模仿R的預期行爲。在R中,因子變量的水平(看起來很像熊貓中的指數)在子集化時不會改變。必須明確重新索引以縮小可能的水平。 –
我不明白你的例子。 uniq_b沒有被使用? –
啊,我想我明白了。你只想'知道'B的獨特價值。 –
如果可能的話,我認爲你應該考慮把接受的答案改爲8one6。 – KobeJohn