这是我第一次问一个问题。
我正在处理一个大型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
如何加快速度?
答案 0 :(得分:3)
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)]