当前位置: 首页 > 面试题库 >

大熊猫:按二级索引范围对MultiIndex进行切片

吉毅
2023-03-14
问题内容

我有一个类似MultiIndex的系列:

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

问题答案:

正如Robbie-Clarken回答的那样,从0.14开始,您可以在传递给loc的元组中传递一个切片:

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中执行此操作。)

该答案是在2013年初推出iloc之前写的,即位置/整数位置-
在这种情况下可能更喜欢。创建它的原因是为了消除整数索引的熊猫对象的歧义,并且更具描述性:“我在位置上切片”。

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

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

最健壮和一致的方式

不是,最一致的方法是描述您在做什么:

  • 使用loc作为标签
  • 使用iloc定位
  • 两者都使用ix(如果确实需要)

记住python的禅宗:

显式胜于隐式



 类似资料:
  • 问题内容: 我正在遍历Go语言之旅中的练习,但遇到了我无法弄清的障碍。我在做这个错误: 这是我的代码: 对于我一生,我找不到问题! 问题答案: 切片 对于字符串,数组,指向数组的指针或切片a,主表达式 a [低:高] 构造一个子字符串或切片。索引表达式low和high选择哪些元素出现在结果中。结果的索引从0开始,长度等于高-低。 对于数组或字符串,索引low和high必须满足0 <= low <=

  • 问题内容: 代码示例: 现在,我要检索A值: Q1 :在[3.3,6.6]范围内- 预期的返回值:[3.3,5.5,6.6]或[3.3,3.3,5.5,6.6](如果包括最后一个值),以及[3.3,5.5] ]或[3.3、3.3、5.5](如果没有)。 Q2 :在[2.0,4.0]范围内-预期返回值:[3.3]或[3.3,3.3] 与任何其他 MultiIndex 维度相同,例如B值: Q3 :在

  • 获取相应列内容满足条件的索引范围的最有效方法是什么。。类似于以标记开始并以“body”标记结束的行。 例如,数据框如下所示 我要得到行索引1-3 有人能提出最具蟒蛇风格的方法来实现这一点吗?

  • 我正在使用从h5文件加载的调查数据作为通过熊猫包。在此中,所有行都是单个调查的结果,而列是单个调查中所有问题的答案。 我的目标是将此数据集缩减为更小的,仅包括在某个问题上具有某个描述答案的行,即在本列中具有相同的值。我能够确定具有此条件的所有行的索引值,但我找不到如何删除这些行或仅使用这些行创建新的df。

  • 问题内容: 经过一些分组后,我创建了一个具有MultiIndex的DataFrame: 如何在MultiIndex前面添加一个级别,以便将其转换为类似以下内容: 问题答案: 一种使用以下代码完成此操作的好方法: 甚至更短的方法: 这可以推广到许多数据框架,请参阅docs。

  • 问题内容: 用更多索引范围(例如by和)对数据帧进行切片的pythonic方法是什么? 我想要一个更优雅的方式: 结果: 像这样的东西会更优雅: 问题答案: 您可以使用numpy的“切片技巧”: 给出: