pandas:按二级索引范围对多索引进行切片

2024-02-14

我有一个像这样的多索引系列:

import numpy as np
import pandas as pd

buckets = np.repeat(['a','b','c'], [3,5,1])
sequence = [0,1,5,0,1,2,4,50,0]

s = pd.Series(
    np.random.randn(len(sequence)), 
    index=pd.MultiIndex.from_tuples(zip(buckets, sequence))
)

# In [6]: s
# Out[6]: 
# a  0    -1.106047
#    1     1.665214
#    5     0.279190
# b  0     0.326364
#    1     0.900439
#    2    -0.653940
#    4     0.082270
#    50   -0.255482
# c  0    -0.091730

我想获取 s['b'] 值,其中第二个索引 ('sequence') 介于 2 和 10 之间。

对第一个索引进行切片效果很好:

s['a':'b']
# Out[109]: 
# bucket  value
# a       0        1.828176
#         1        0.160496
#         5        0.401985
# b       0       -1.514268
#         1       -0.973915
#         2        1.285553
#         4       -0.194625
#         5       -0.144112

但第二个不是,至少通过两种最明显的方式:

1) 这将返回元素 1 到 4,与索引值无关

s['b'][1:10]

# In [61]: s['b'][1:10]
# Out[61]: 
# 1     0.900439
# 2    -0.653940
# 4     0.082270
# 50   -0.255482

但是,如果我反转索引并且第一个索引是整数而第二个索引是字符串,则它可以工作:

In [26]: s
Out[26]: 
0   a   -0.126299
1   a    1.810928
5   a    0.571873
0   b   -0.116108
1   b   -0.712184
2   b   -1.771264
4   b    0.148961
50  b    0.089683
0   c   -0.582578

In [25]: s[0]['a':'b']
Out[25]: 
a   -0.126299
b   -0.116108

As 罗比-克拉肯的回答 https://stackoverflow.com/a/31490891/1240268,从 0.14 开始你可以通过对传递给 loc 的元组进行切片 http://pandas.pydata.org/pandas-docs/stable/advanced.html#using-slicers:

In [11]: s.loc[('b', slice(2, 10))]
Out[11]:
b  2   -0.65394
   4    0.08227
dtype: float64

事实上,您可以为每个级别传递一个切片:

In [12]: s.loc[(slice('a', 'b'), slice(2, 10))]
Out[12]:
a  5    0.27919
b  2   -0.65394
   4    0.08227
dtype: float64

注意:切片是包含在内的。


旧答案:

您还可以使用以下方法执行此操作:

s.ix[1:10, "b"]

(最好在单个 ix/loc/iloc 中执行此操作,因为此版本允许分配。)

这个答案是在之前写的国际劳工组织简介 https://github.com/pydata/pandas/pull/29222013 年初,即位置/整数位置 - 在这种情况下可能是首选。创建它的原因是为了消除整数索引的 pandas 对象的歧义,并更具描述性:“我在位置上切片”。

s["b"].iloc[1:10]

也就是说,我有点不同意 ix 的文档:

最稳健和一致的方式

事实并非如此,最一致的方式是描述你正在做的事情:

  • 使用 loc 作为标签
  • 使用 iloc 获取位置
  • 两者都使用 ix (如果你真的必须这样做)

记住蟒蛇之禅 https://www.python.org/dev/peps/pep-0020/:

显式优于隐式

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pandas:按二级索引范围对多索引进行切片 的相关文章

随机推荐