我有一个函数,每行根据当前行的三列值获取所有前面的行。我使用两种方法来获取我需要的行:
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文本,因此这是一个问题。
答案 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