Python 条件为真的索引。效率和简洁

Python 条件为真的索引。效率和简洁,python,pandas,Python,Pandas,假设我有一个数据帧: this_is_my_dataframe_with_a_long_name 我想找到一个条件为真的指数。例如,假设条件是列等于值 我知道我在技术上可以做到: dataframe_with_a_long_name[dataframe_with_a_long_name['column'] =='A].index 这让我想知道: 以上是检索这些索引的最有效方法吗?请注意,上面的代码创建了真/假值的临时副本,使用此输出为数据帧编制索引,然后检索结果视图的索引 是否有更简洁的方式

假设我有一个数据帧:

this_is_my_dataframe_with_a_long_name
我想找到一个条件为真的指数。例如,假设条件是列等于值

我知道我在技术上可以做到:

dataframe_with_a_long_name[dataframe_with_a_long_name['column'] =='A].index
这让我想知道:

以上是检索这些索引的最有效方法吗?请注意,上面的代码创建了真/假值的临时副本,使用此输出为数据帧编制索引,然后检索结果视图的索引

是否有更简洁的方式运行此查询?例如,idxmin允许一个方法调用直接查询索引的最小值。在条件为真的情况下,检索索引是否有任何等价物?e、 g:


在普通熊猫身上,这可能是最好的写法。随着数据帧变得越来越大,使用更新的方法可能会有一些加速,通常会更简洁,特别是如果数据帧名称更长

In [154]: df = pd.DataFrame(np.random.rand(10000000), columns=['a'])

In [155]: %timeit df[df['a'] < .25].index
10 loops, best of 3: 154 ms per loop

In [156]: %timeit df.query('a < .25').index
1 loops, best of 3: 129 ms per loop
编辑:

正如@Jeff所指出的,如果您只需要索引,那么最快的路径实际上是:

In [160]: %timeit df.index[df['a'] < .25]
10 loops, best of 3: 81.6 ms per loop

在普通熊猫身上,这可能是最好的写法。随着数据帧变得越来越大,使用更新的方法可能会有一些加速,通常会更简洁,特别是如果数据帧名称更长

In [154]: df = pd.DataFrame(np.random.rand(10000000), columns=['a'])

In [155]: %timeit df[df['a'] < .25].index
10 loops, best of 3: 154 ms per loop

In [156]: %timeit df.query('a < .25').index
1 loops, best of 3: 129 ms per loop
编辑:

正如@Jeff所指出的,如果您只需要索引,那么最快的路径实际上是:

In [160]: %timeit df.index[df['a'] < .25]
10 loops, best of 3: 81.6 ms per loop

codereview.stackexchange.com。。。。另外,df=dataframe_,名称为a_long_,现在改用df…感谢@JoranBeasley使用df需要为一条语句创建一个额外的变量别名。跟踪如此短的别名以避免冲突并非易事。另外,请看我关于效率的说明,这是我在这个问题上最关心的。。。这没什么错。。。在效率方面。。。这太慢了吗?你有没有分析过以确定这是瓶颈?通常这些操作速度非常快,因为它们被矢量化到c区域。。。虽然如果你的阵列太小,它实际上会变慢。谢谢@JoranBeasley,那么这是相对有效的吗?没有创建或移动副本等?谢谢@JoranBeasley我正在使用约7000万行的数据帧。我希望我的问题仍然有意义。无论哪种方式,我都对如何编写高效的熊猫代码感兴趣,而不管我当前的dataframe.codereview.stackexchange.com的具体情况。。。。另外,df=dataframe_,名称为a_long_,现在改用df…感谢@JoranBeasley使用df需要为一条语句创建一个额外的变量别名。跟踪如此短的别名以避免冲突并非易事。另外,请看我关于效率的说明,这是我在这个问题上最关心的。。。这没什么错。。。在效率方面。。。这太慢了吗?你有没有分析过以确定这是瓶颈?通常这些操作速度非常快,因为它们被矢量化到c区域。。。虽然如果你的阵列太小,它实际上会变慢。谢谢@JoranBeasley,那么这是相对有效的吗?没有创建或移动副本等?谢谢@JoranBeasley我正在使用约7000万行的数据帧。我希望我的问题仍然有意义。无论哪种方式,我都对如何编写高效的熊猫代码感兴趣,而不管我当前数据帧的具体情况。如果您只需要索引,那么df.index[df['a']如果您只需要索引,那么df.index[df['a']