【问题标题】:How do I select rows based on columns values with Pandas?如何使用 Pandas 根据列值选择行?
【发布时间】: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 毫秒。

标签: python pandas


【解决方案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

【讨论】:

  • 我也这么认为,不会有太大的改善。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
相关资源
最近更新 更多