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

Python Pandas-为什么“ in”运算符只处理索引而不处理数据?

骆照
2023-03-14
问题内容

我发现了Pandasin运算符应用于Series索引而不是实际数据的困难方式:

In [1]: import pandas as pd

In [2]: x = pd.Series([1, 2, 3])

In [3]: x.index = [10, 20, 30]

In [4]: x
Out[4]:
10    1
20    2
30    3
dtype: int64

In [5]: 1 in x
Out[5]: False


In [6]: 10 in x
Out[6]: True

我的直觉是该x系列包含数字1而不是索引10,这显然是错误的。此行为背后的原因是什么?以下方法是最好的替代方法吗?

In [7]: 1 in set(x)
Out[7]: True

In [8]: 1 in list(x)
Out[8]: True

In [9]: 1 in x.values
Out[9]: True

更新

我对建议做了一些安排。看来x.values是最好的方法:

In [21]: x = pd.Series(np.random.randint(0, 100000, 1000))

In [22]: x.index = np.arange(900000, 900000 + 1000)

In [23]: x.tail()
Out[23]:
900995    88999
900996    13151
900997    25928
900998    36149
900999    97983
dtype: int64

In [24]: %timeit 36149 in set(x)
10000 loops, best of 3: 190 µs per loop

In [25]: %timeit 36149 in list(x)
1000 loops, best of 3: 638 µs per loop

In [26]: %timeit 36149 in (x.values)
100000 loops, best of 3: 6.86 µs per loop

问题答案:

pandas.Series将a视为类似于字典的字典可能会有所帮助,其中的index值等于keys。比较:

>>> d = {'a': 1}
>>> 1 in d
False
>>> 'a' in d
True

与:

>>> s = pandas.Series([1], index=['a'])
>>> 1 in s
False
>>> 'a' in s
True

但是,请注意,对系列进行迭代将对进行迭代data,而不是对进行迭代index,因此list(s)将得出[1]not ['a']

确实,根据文档,index“必须是唯一的且 可哈希化
,所以我猜想那里下面有一个哈希表。



 类似资料:
  • 本文向大家介绍js为什么不能正确处理小数运算?,包括了js为什么不能正确处理小数运算?的使用技巧和注意事项,需要的朋友参考一下 上面的程序会输出1吗? 在 你有必要知道的 25 个 JavaScript 面试题 一文中,第 8 个题浅显的说了下 js 为什么不能正确处理小数运算的问题。今天重拾旧题,更深层次的剖析下这个问题。 但要先说明的是,不能正确处理小数的运算并不是 JavaScript 语言

  • 主要内容:算术运算符,关系运算符,逻辑运算符,赋值运算符,按位运算符运算符是一个符号,它告诉编译器执行特定的数学或逻辑操作。 在批处理脚本中,以下类型的操作符是可以执行的。 算术运算符 关系运算符 逻辑运算符 赋值运算符 按位运算符 算术运算符 批处理脚本语言支持任何语言的普通算术运算符。 以下是可用的算术运算符。 算术运算符示例 运算符 描述 示例 两个操作数相加 的结果为: 从第一个减去第二个操作数 的结果为: 两个操作数的乘法 的结果为: 分母除以分子 的结

  • 这是一个按照字母顺序排序的,由Autoconf宏定义的C预处理符号的列表。为了与Autoconf协同工作,C源代码应该 在#if指令中使用这些名字。 _ CHAR_UNSIGNED _ALL_SOURCE _MINIX _POSIX_1_SOURCE _POSIX_SOURCE, _POSIX_SOURCE _POSIX_VERSION c C_ALLOCA CLOSEDIR_VOID const

  • 问题内容: 我看到了一些无法解释的Proguard行为。 AFAIK proguard不关注android清单。另外,在我的proguard.cfg文件中,我没有提及BroadcastReceiver相关的类。因此,我认为应该删除这些内容。 但是我在bin / proguard.txt中看到了一些奇怪的东西: 并且该类(BroadcastReceiver的后裔)不会被剥离。理性对我没有任何意义:

  • 问题内容: 在Java的其他任何地方,任何带有索引的内容都从0开始。这里是否有进行更改的原因,或者这只是不良的设计? 问题答案: 历史上,数据库对绑定参数使用基于1的索引。这可能反映了关系数据库在集合论和数学中的起源,即索引元素以1开头,并使用零表示空集或空集。 在shell脚本和正则表达式中,零索引通常表示“特殊”。例如,对于shell脚本,第零个“参数”实际上是被调用的命令。 JDBC的选择是

  • 问题内容: 在React教程中,它说 这样做会立即发出警报,而不是在单击按钮时发出警报。 但是,我不明白为什么会这样…任何人都可以为我澄清一下吗?为什么不能将函数调用作为处理程序传递? 问题答案: 当您执行此操作时,将调用该函数并将返回的值()分配给该属性。所以,React看到的是这样说的: 嗯,那不是一个函数,为什么我要添加这样的处理程序? 您要传递的是一个函数,而不是。 因此,您必须做:可以像