【问题标题】:Get unique values from index column in MultiIndex从 MultiIndex 中的索引列获取唯一值
【发布时间】:2021-01-20 13:54:47
【问题描述】:

我知道我可以通过重置索引来获取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'])

pandas 有内置的方法吗?

【问题讨论】:

  • 我不明白你的例子。 uniq_b 没有被使用?
  • 啊,我想我明白了。你只是想“知道” B. 的独特价值。好的。
  • 如果可能的话,我认为您应该考虑将接受的答案更改为 8one6。

标签: python pandas


【解决方案1】:

一种方法是使用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)

【讨论】:

  • 这是一个很好的答案,但在一些特定情况下它有一些非常奇怪的行为。请查看下面我的答案,以了解避免这些问题的方法。
  • 这对我不起作用。索引不再具有属性级别。这是更新吗?
  • @eleijonmarck 只有一个多索引有一个级别属性。这是你的问题吗?
【解决方案2】:

Andy Hayden 的回答 (index.levels[blah]) 在某些情况下非常有用,但在其他情况下可能会导致奇怪的行为。我的理解是,Pandas 会尽可能地“重用”索引,以避免大量索引相似的 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()

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

【讨论】:

  • FWIW,如果试图模仿 R,这是预期的行为。在 R 中,因子变量的水平(看起来很像 pandas 中的索引)在子集化时不会改变。必须明确地重新索引以缩小可能的级别。
  • @ChrisWarth 感谢您提醒我在 R 中的这种行为,我完全忘记了!看起来我未来的某个周末会有一个玩具项目:-D
【解决方案3】:

另一种方法是使用索引的unique()函数

df.index.unique('B')

levels 不同,此函数已记录在案。

【讨论】:

    猜你喜欢
    • 2019-11-26
    • 2020-03-26
    • 2014-05-12
    • 2021-10-12
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    相关资源
    最近更新 更多