如何提高Pandas GroupBy筛选器操作的性能?

时间:2019-02-09 20:32:57

标签: python pandas group-by pandas-groupby

这是我第一次问一个问题。

我正在处理一个大型CSV数据集(它包含超过1500万行,并且大小超过1.5 GB)。

我正在将摘录加载到在Jupyter Notebooks中运行的Pandas数据帧中,以基于数据集导出算法。我按MAC地址对数据进行分组,结果得出1+百万个分组。

我算法开发的核心正在运行此操作:

pandas.core.groupby.DataFrameGroupBy.filter

运行此操作需要3到5分钟,具体取决于数据集。要开发此算法,我必须执行此操作数百次,甚至数千次。

此操作似乎受CPU限制,并且仅使用计算机上可用的几个内核之一。我花了几个小时在线研究潜在的解决方案。我尝试同时使用numbadask来加快此操作的速度,并且两次尝试均导致异常。

Numba提供了一条信息,表示“这不应该发生,谢谢您帮助改进产品”。看起来Dask可能未实现DataFrameGroupBy.filter操作。我无法确定如何重新编写代码以使用pool / map

我正在寻找有关如何加快此操作的建议:

pandas.core.groupby.DataFrameGroupBy.filter

这是我的代码中此操作的示例。还有其他例子,所有这些例子似乎都具有相同的执行时间。

import pandas as pd

def import_data(_file, _columns):
    df = pd.read_csv(_file, low_memory = False)
    df[_columns] = df[_columns].apply(pd.to_numeric, errors='coerce')
    df = df.sort_values(by=['mac', 'time'])
    # The line below takes ~3 to 5 minutes to run
    df = df.groupby(['mac']).filter(lambda x: x['latency'].count() > 1)
    return df

如何加快速度?

1 个答案:

答案 0 :(得分:3)

filter通常与GroupBy一起使用时速度较慢。如果您尝试基于GroupBy内部的条件过滤DataFrame,则更好的选择是使用transformmap

df[df.groupby('mac')['latency'].transform('count').gt(1)]

df[df['mac'].map(df.groupby('mac')['latency'].count()).gt(1)]