python - 高效查询pandas数据集

标签 python pandas dataframe

假设 pandas 数据集包含 800 万行和 20 列。

程序查询数据集以查找特定列的平均值。

基于其他列的选择的平均值

需要帮助才能快速响应一万个查询并减少查询执行时间

设置:

import pandas as pd
from random import randint


df = pd.DataFrame({'A': ['A1','A2','A3','A4','A5','A2','A2','A1','A4','A4'],
               'B': ['BA1','BA2','BA3','BA4','BA5','BA2','BA2','BA1','BA4','BA4'],
               'C': ['CA1','CA2','CA3','CA4','CA5','CA2','CA2','CA1','CA4','CA4'],
               'D': ['D1','D2','D3','D4','D5','D2','D2','D1','D4','D4'],
               'important_col': [randint(1, 9)*100 for x in xrange(10)]})

数据集示例:

        A    B       C      D   important_col
  0     A1  BA1     CA1     D1  400
  1     A2  BA2     CA2     D2  500
  2     A3  BA3     CA3     D3  100
  3     A4  BA4     CA4     D4  100
  4     A5  BA5     CA5     D5  400
  5     A2  BA2     CA2     D2  900
  6     A2  BA2     CA2     D2  100
  7     A1  BA1     CA1     D1  300
  8     A4  BA4     CA4     D4  800
  9     A4  BA4     CA4     D4  100

查询示例:

df[(df['A']== 'A1')]['important_col'].mean()
df[(df['A']== 'A2') & (df['B'] == 'BA2')]['important_col'].mean()
df[(df['A']== 'A4') & (df['C'] == 'CA4') & (df['D'] == 'D4')]['important_col'].mean()

建立索引有助于解决问题吗?可以使用 .loc.ix 吗?或任何其他解决方案?

最佳答案

A 到 D 列可以转换为类别,因为这些值不唯一且有限。

下面的示例基于您在 OP 中提供的 df。

# Original data frame
df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 5 columns):
A                10 non-null object
B                10 non-null object
C                10 non-null object
D                10 non-null object
important_col    10 non-null int64
dtypes: int64(1), object(4)
memory usage: 480.0+ bytes

# Convert to category
df['A'] = df.A.astype('category')
df['B'] = df.B.astype('category')
df['C'] = df.C.astype('category')
df['D'] = df.D.astype('category')

# Modified data frame
df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 5 columns):
A                10 non-null category
B                10 non-null category
C                10 non-null category
D                10 non-null category
important_col    10 non-null int64
dtypes: category(4), int64(1)
memory usage: 360.0 bytes

您应该看到内存使用方面的好处(值被整数替换并使用小型查找表进行映射)以及选择时的速度(基于整数值的查找将比使用字符串值的相同查找更快) .

更新

我创建了一个Jupyter notebook显示简单地将列转换为类别的改进。

使用 1.000.000 行的样本(与 OP 定义的结构相同)和 OP 中提供的示例查询,随着大小从 232.7 MB 降至 11.4 MB,内存使用情况得到改善 MB(减少 95%)。

此外,示例查询还显示出速度优势:

  • 查询 1:改进 83%(57 毫秒 > 9.36 毫秒)
  • 查询 2:提升 91%(80.9 毫秒 > 6.97 毫秒)
  • 查询 3:提升 92%(119 毫秒 > 9.37)

我使用 8 mio 样本进行了相同的测试,获得了相同的速度和资源使用率改进。

关于python - 高效查询pandas数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38079887/

相关文章:

python - 为什么在更新字典时得到 None?

python - 内联表单集 is_valid 错误 : list index out of range

Python - 用于将 url 与 mongo 对象 id 匹配的正则表达式

python - 如何在 Pandas 中打印 CSV 中的某些行

python - 修改 Pandas 数据框中的许多列

python - 如果子字符串列表中的任何值包含在数据框中的任何列中,则过滤行

javascript - 如何不使用kml加载谷歌地图地理位置

python - 如何过滤跨列具有接近值的行

python - 将新数据框插入现有数据框到 Pandas 中的特定行位置

scala - 如何通过编号而不是名称选择数据框中的列