如何根据Pandas的列值选择行?

时间:2015-07-26 23:27:11

标签: 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.groupby(cols)
rows = group_by_cols.get_group((1.2, 5, 2.5))

在IPython Notebook中使用%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而不是csv。

我不熟悉它,所以我想问一下我是否用一个名为" data"的表创建了一个hdf文件。包含我的所有数据和表,其中包含与我想要的每个参数组合匹配的行,然后调用每行所需的表,这会比2的方式更快吗?

我尝试将hdf与pandas一起使用,但我的数据中有unicode文本,因此这是一个问题。

1 个答案:

答案 0 :(得分:1)

这两种方法都已经相当优化了,如果你选择了很多进入cython的话,我会感到惊讶。

但是,有一个.query方法可以帮助提高性能,假设你的框架有点大。有关详细信息,请参阅docs或更低版本。

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