首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将多个索引分类到全深度(Pandas)

将多个索引分类到全深度(Pandas)
EN

Stack Overflow用户
提问于 2013-11-14 15:22:38
回答 3查看 11.7K关注 0票数 18

我有一个dataframe,它是从csv文件加载的,然后通过set_index方法将索引设置为它的几个列(通常是两个或三个)。这样做的目的是使用几个关键组合访问数据文件的各个部分,如下所示:

代码语言:javascript
运行
复制
df.set_index(['fileName','phrase'])
df.ix['somePath','somePhrase']

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

由于某些原因,当Im设置索引时,在我看来这两个层似乎都已排序,调用df.index.lexsort_depth命令将返回1,并且在尝试使用两个键访问时会出现以下错误:

MultiIndex词汇排序深度1,键长2

有什么帮助吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-14 16:17:55

你要问什么还不太清楚。多索引文档是这里

OP需要设置索引,然后进行排序。

代码语言:javascript
运行
复制
df.set_index(['fileName','phrase'],inplace=True)
df.sortlevel(inplace=True)

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

代码语言:javascript
运行
复制
df.ix[('somePath','somePhrase')]

也许给出一个这样的玩具例子,并表明我想得到一个具体的结果。

代码语言:javascript
运行
复制
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
票数 11
EN

Stack Overflow用户

发布于 2015-05-16 17:10:43

我意识到一段时间过去了,但我似乎遇到了与@idoda相同的问题,当数据格式可能在列和索引上都有多个索引时,公认的答案不适用于MultiIndex数据格式。诀窍,目前没有显示,是有一个“轴”选项,默认为零,但也可以设置为1。

例如,如果您尝试:

代码语言:javascript
运行
复制
df.sortlevel(inplace=True,sort_remaining=True)

并且仍然在获取词汇排序错误,知道它们是默认的"axis=0“kwarg可能是相关的。因此,您也可以尝试添加

代码语言:javascript
运行
复制
df.sortlevel(axis=1,inplace=True,sort_remaining=True)

这应该是另一个方向。如果你不想去想,你可以用暴力强迫它:

代码语言:javascript
运行
复制
df.sortlevel(axis=0,inplace=True,sort_remaining=True)
df.sortlevel(axis=1,inplace=True,sort_remaining=True)

这应该在所有级别上对列和行索引进行完全排序。我在这里也有同样的问题,无法得到一个完整的词汇排序与建议的答案,但一些研究表明,即使是"sort_remaining“真,排序级别只适用于一个单一的轴。这些片段是目前出现的节奏式原生答案的解决方案。希望有人能帮上忙!

票数 4
EN

Stack Overflow用户

发布于 2018-02-19 18:02:07

熊猫提供:

代码语言:javascript
运行
复制
d = d.sort_index()
print d.index.is_lexsorted() # Sometimes true

在大多数情况下都能做你想做的事。但是,总是对索引进行排序,但是它可能保留为‘词汇排序’(例如,如果索引中有NAN),这是生成一个PerformanceWarning

为避免这种情况:

代码语言:javascript
运行
复制
d = d.sort_index(level=d.index.names)
print d.index.is_lexsorted() #  true

..。虽然这两者之间的差异似乎并没有被记录下来。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19981518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档