【发布时间】:2015-08-02 08:09:33
【问题描述】:
我有一个函数,它可以根据当前行的三列的值对每一行获取所有先前的行。我使用两种方法来获取我需要的行:
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 来提高性能的信息,但我从未使用过它。
如果有帮助,我使用的列中的值是浮点数。
更新:
在 cmets 中提到使用 HDF over csv。
我不熟悉它,所以我想问一下我是否创建了一个 hdf 文件,其中包含一个名为“data”的表,其中包含我的所有数据和表,其中包含与我想要的每个参数组合匹配的行,然后调用每行需要的表,会比方式2快吗?
我尝试将 hdf 与 pandas 一起使用,但我的数据中有 unicode 文本,所以这是个问题。
【问题讨论】:
-
我不确定你的问题......你的意思是最快的方法是什么?如果是这样,我很确定 numpy/cython 会做!附:我认为第一种方法是最好的,时间结果让我惊讶:O
-
@Challensois:你说得对,我正在寻找最快的方法。由于我不习惯 Cython,你能估计一下性能会提高多少吗?
-
在 250k 行的较大数据集上,在我的计算机上,Way 2 比 Way 1 快 3 倍,Way 1 比下面 @Chrisb 提出的 (
query) 方法慢 3 倍。鉴于上述方式 2 的时间与下面@Chrisb 提供的时间,我假设它基于一个非常小的数据集。 -
@evil_inside 我认为方式 2 比方式 1 快的原因是因为数据集首先在
groupby中排序,然后选择只是简单的二进制搜索,比穷举搜索要快得多大数据集。因此,如果您的数据集非常大,也许先将它们存储在磁盘数据库/HDF 中,而不是 csv 文件中,然后在那里对其进行排序,然后再进行查询。 -
@Jianxun Li:我认为您对方式 2 更快的原因是正确的。如果我使用你提到的方式,它会快多少?我还尝试将索引设置为我想要的列,然后获取切片,但速度要慢得多,大约 170 毫秒。