Python 如何使用Pandas根据列值选择行?

Python 如何使用Pandas根据列值选择行?,python,pandas,Python,Pandas,我有一个函数,它根据当前行的三列的值,为每一行获取前面的所有行。我使用两种方法获取所需的行: import pandas as pd df = pd.read_csv("data.csv") # Way 1 rows = df[(df["colA"] == 1.2) & (df["colB"] == 5) & (df["colC"] == 2.5)] # Way 2 cols = ["colA", "colB", "colC"] group_by_cols = df.gro

我有一个函数,它根据当前行的三列的值,为每一行获取前面的所有行。我使用两种方法获取所需的行:

import pandas as pd

df = pd.read_csv("data.csv")

# Way 1
rows = df[(df["colA"] == 1.2) & (df["colB"] == 5) & (df["colC"] == 2.5)]

# Way 2
cols = ["colA", "colB", "colC"]
group_by_cols = df.groupby(cols)
rows = group_by_cols.get_group((1.2, 5, 2.5))
在IPython笔记本中使用
%timeit

# Way 1
100 loops, best of 3: 16.6 ms per loop

# Way 2
100 loops, best of 3: 3.42 ms per loop
我正试图找到一种方法来提高所需的时间。我读过关于使用Cython来提高性能的文章,但我从未使用过它

如果有帮助的话,我使用的列中的值是浮动

更新:

在评论中提到了使用HDF over csv

我对它不熟悉,所以我想问一下,如果我创建了一个hdf文件,其中有一个名为“data”的表,其中包含我所有的数据,表中包含与我想要的每个参数组合相匹配的行,然后调用每行所需的表,这会比方法2更快吗


我尝试使用hdf和pandas,但是我的数据中有unicode文本,所以这是一个问题。

这两种方法都已经非常优化了,如果你在cython上学到了很多东西,我会感到惊讶

但是,有一个
.query
方法,假设您的帧有点大,它应该有助于提高性能。有关更多信息,请参阅,或下面的示例

df = pd.DataFrame({'A':[1.0, 1.2, 1.5] * 250000, 'B':[1.0, 5.0, 1.5] * 250000, 'C':[1.0, 2.5, 99.0] * 250000})

In [5]: %timeit rows = df[(df["A"] == 1.2) & (df["B"] == 5) & (df["C"] == 2.5)]
10 loops, best of 3: 33.4 ms per loop

In [6]: %%timeit
   ...: cols = ["A", "B", "C"]
   ...: group_by_cols = df.groupby(cols)
   ...: rows = group_by_cols.get_group((1.2, 5, 2.5))
   ...: 
10 loops, best of 3: 140 ms per loop


In [8]: %timeit rows = df.query('A == 1.2 and B == 5 and C == 2.5')
100 loops, best of 3: 14.8 ms per loop

我不知道你的问题是什么。。。你是说最快的方法是什么?如果是这样的话,我很肯定numpy/cython会成功的!另外,我认为第一种方法是最好的,它的结果令我惊讶:O@Challensois当前位置你说得对,我正在寻找最快的方法。由于我不习惯Cython,您能估计性能会提高多少吗?在25万行的较大数据集上,在我的计算机上,方式2比方式1快3倍,而方式1比下面@Chrisb提出的(
query
)方法慢3倍。鉴于上述方式2的时间安排与下文@Chrisb提供的时间安排,我假设它是基于一个非常小的数据集。@evil\u我认为方法2比方法1快的原因是数据集首先在
groupby
中排序,然后选择是简单的二进制搜索,比大数据集的穷举搜索快得多。所以,如果您的数据集非常大,也许可以先将它们存储在磁盘数据库/HDF中,而不是csv文件中,然后在那里对它们进行排序,然后再进行查询。@Jianxun Li:我认为您说得对,为什么way 2更快。如果我用你提到的方式,会快多少?我还尝试将索引设置为我想要的列,然后获得切片,但是速度慢了很多,大约170毫秒。我认为同样的,不会有太大的改进。