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

Rob*_*b P 5 python group-by pandas pandas-groupby

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

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

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

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

pandas.core.groupby.DataFrameGroupBy.filter
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

pandas.core.groupby.DataFrameGroupBy.filter
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我怎样才能加快速度?

cs9*_*s95 8

filter通常已知与 一起使用时速度很慢GroupBy。如果您尝试根据 GroupBy 内的条件过滤 DataFrame,更好的选择是使用transformor map

df[df.groupby('mac')['latency'].transform('count').gt(1)]
Run Code Online (Sandbox Code Playgroud)

df[df['mac'].map(df.groupby('mac')['latency'].count()).gt(1)]
Run Code Online (Sandbox Code Playgroud)

  • 谢谢 - 这解决了我的问题!转换选项在 4 秒内运行,地图选项在 5 秒内运行。这表示速度提高了 50 倍。 (2认同)