17

我有一个数据框,我从 csv 文件加载,然后通过该set_index方法将索引设置为它的少数列(通常是两列或三列)。这个想法是然后使用几个组合键访问部分数据帧,例如:

df.set_index(['fileName','phrase'])
df.ix['somePath','somePhrase']

MultiIndex显然,只有当数据帧的排序到足够的深度时,这种具有多个键的选择才有可能。在这种情况下,由于我提供了两个键,因此只有当数据帧被排序到至少 2 的深度时,.ix操作才会失败。MultiIndex

出于某种原因,当我如图所示设置索引时,对我来说似乎两个图层都已排序,调用 df.index.lexsort_depth命令返回1,并且在尝试使用两个键访问时出现以下错误:

MultiIndex lexsort 深度 1,键是长度 2

有什么帮助吗?

4

3 回答 3

11

它不是很清楚你在问什么。多索引文档在这里

OP需要设置索引,然后就地排序

df.set_index(['fileName','phrase'],inplace=True)
df.sortlevel(inplace=True)

然后通过元组访问这些级别以获得特定结果

df.ix[('somePath','somePhrase')]

也许只是举一个这样的玩具例子,并表明我想得到一个特定的结果。

In [1]: arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'])
   ...:    .....: ,
   ...:    .....:           np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])
   ...:    .....:           ]

In [2]: df = DataFrame(randn(8, 4), index=arrays)

In [3]: df
Out[3]: 
                0         1         2         3
bar one  1.654436  0.184326 -2.337694  0.625120
    two  0.308995  1.219156 -0.906315  1.555925
baz one -0.180826 -1.951569  1.617950 -1.401658
    two  0.399151 -1.305852  1.530370 -0.132802
foo one  1.097562  0.097126  0.387418  0.106769
    two  0.465681  0.270120 -0.387639 -0.142705
qux one -0.656487 -0.154881  0.495044 -1.380583
    two  0.274045 -0.070566  1.274355  1.172247

In [4]: df.index.lexsort_depth
Out[4]: 2

In [5]: df.ix[('foo','one')]
Out[5]: 
0    1.097562
1    0.097126
2    0.387418
3    0.106769
Name: (foo, one), dtype: float64

In [6]: df.ix['foo']
Out[6]: 
            0         1         2         3
one  1.097562  0.097126  0.387418  0.106769
two  0.465681  0.270120 -0.387639 -0.142705

In [7]: df.ix[['foo']]
Out[7]: 
                0         1         2         3
foo one  1.097562  0.097126  0.387418  0.106769
    two  0.465681  0.270120 -0.387639 -0.142705

In [8]: df.sortlevel(level=1)
Out[8]: 
                0         1         2         3
bar one  1.654436  0.184326 -2.337694  0.625120
baz one -0.180826 -1.951569  1.617950 -1.401658
foo one  1.097562  0.097126  0.387418  0.106769
qux one -0.656487 -0.154881  0.495044 -1.380583
bar two  0.308995  1.219156 -0.906315  1.555925
baz two  0.399151 -1.305852  1.530370 -0.132802
foo two  0.465681  0.270120 -0.387639 -0.142705
qux two  0.274045 -0.070566  1.274355  1.172247

In [10]: df.sortlevel(level=1).index.lexsort_depth
Out[10]: 0
于 2013-11-14T16:17:55.447 回答
4

我意识到已经过去了一段时间,但我似乎遇到了与@idoda 相同的问题,当数据帧可能在列和索引上都有多个索引时,接受的答案不适用于 MultiIndex 数据帧。此处当前未显示的技巧是有一个“轴”选项,默认为零,但也可以设置为 1。

例如,如果您尝试:

df.sortlevel(inplace=True,sort_remaining=True)

并且仍然遇到 lexsort 错误,知道它们是其中的默认“axis = 0”kwarg 可能相关。因此,您也可以尝试添加

df.sortlevel(axis=1,inplace=True,sort_remaining=True)

哪个应该排序另一个方向。如果您不想考虑它,则可以通过以下方式进行暴力破解:

df.sortlevel(axis=0,inplace=True,sort_remaining=True)
df.sortlevel(axis=1,inplace=True,sort_remaining=True)

这应该对所有级别的列和行索引进行完全排序。我在这里遇到了同样的问题,无法通过建议的答案获得完整的 lexsort,但一些研究表明,即使使用“sort_remaining”True,sortlevel 也仅适用于单个轴。这些片段是当前pythonic本机答案的解决方案。希望有人觉得它有帮助!

于 2015-05-16T17:10:43.477 回答
2

熊猫提供:

d = d.sort_index()
print d.index.is_lexsorted() # Sometimes true

在大多数情况下,它会做你想做的事。但是,始终对索引进行排序,但可能会将其保留为“lexsorted”(例如,如果索引中有 NAN),这会生成 PerformanceWarning

为了避免这种情况:

d = d.sort_index(level=d.index.names)
print d.index.is_lexsorted() #  true

...虽然似乎没有记录为什么会有差异。

于 2018-02-19T18:02:07.703 回答