python-按类别过滤熊猫数据帧的最快方法

我有一个非常大的数据框,其中包含1亿行和分类列.我想知道是否有比使用here提到的.isin()方法或.join()方法更快的按类别选择行的方法.

考虑到数据已经分类,我认为选择类别应该很快,但是我进行的一些测试却令人失望.我找到的唯一其他解决方案是来自here,但该解决方案似乎不适用于0.20.2的熊猫.

这是一个示例数据集.

import pandas as pd
import random
import string
df = pd.DataFrame({'categories': [random.choice(string.ascii_letters) 
                                  for _ in range(1000000)]*100,
                   'values': [random.choice([0,1]) 
                              for _ in range(1000000)]*100})
df['categories'] = df['categories'].astype('category')

用.isin()测试:

%timeit df[df['categories'].isin(list(string.ascii_lowercase))]
44 s ± 894 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

使用.join():

%timeit df.set_index('categories').join(
    pd.Series(index=list(string.ascii_lowercase), name='temp'), 
    how='inner').rename_axis('categories').reset_index().drop('temp', 1)
24.7 s ± 1.69 s per loop (mean ± std. dev. of 7 runs, 1 loop each)

解决方法:

这是一种类似但不同的方法,可以直接比较值而不是使用isin.

基本地图/ lambda比较:

%timeit df[df['categories'].map(lambda x: x in string.ascii_lowercase)]
> 1 loop, best of 3: 12.3 s per loop

使用isin:

%timeit df[df['categories'].isin(list(string.ascii_lowercase))]
> 1 loop, best of 3: 55.1 s per loop

版本:Py 3.5.1 / IPython 5.1.0 / Pandas 0.20.3

背景:我注意到在one of the SO posts中您链接一个评论者,提到评论者isin需要在执行期间创建set(),因此跳过该步骤并进行基本列表查找似乎是此处的加速.

disclamer:不是我经常处理的秤的类型,因此可能会有更快的选择.

编辑:Johngalt的评论中可应要求提供更多详细信息:

df.shape
> (100000000, 2)
df.dtypes
> categories    category
 values           int64
 dtype: object

为了创建样本数据,我从初始问题中复制/粘贴了样本DF.在2015年初的MBP模型上运行.

相关文章

转载:一文讲述Pandas库的数据读取、数据获取、数据拼接、数...
Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基...
整体流程登录天池在线编程环境导入pandas和xrld操作EXCEL文件...
 一、numpy小结             二、pandas2.1为...
1、时间偏移DateOffset对象DateOffset类似于时间差Timedelta...
1、pandas内置样式空值高亮highlight_null最大最小值高亮背景...