如何提高Pandas GroupBy筛选器操作的性能?
问题内容:
这是我第一次问一个问题。
我正在使用大型CSV数据集(它包含超过1500万行,并且大小超过1.5 GB)。
我正在将摘录加载到在Jupyter
Notebooks中运行的Pandas数据帧中,以基于数据集导出算法。我按MAC地址对数据进行分组,结果得出1+百万个分组。
我的算法开发的核心是运行此操作:
pandas.core.groupby.DataFrameGroupBy.filter
运行此操作需要3到5分钟,具体取决于数据集。要开发此算法,我必须执行此操作数百次,也许数千次。
此操作似乎受CPU限制,并且仅使用计算机上可用的几个内核之一。我花了几个小时在线研究潜在的解决方案。我试图同时使用这两种方法numba
并dask
加快此操作的速度,但两次尝试均导致异常。
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
我怎样才能加快速度?
问题答案:
filter
通常与一起使用时速度较慢GroupBy
。如果您尝试基于GroupBy内部的条件过滤DataFrame,则更好的选择是使用transform
或map
:
df[df.groupby('mac')['latency'].transform('count').gt(1)]
df[df['mac'].map(df.groupby('mac')['latency'].count()).gt(1)]