【发布时间】:2025-12-12 07:30:01
【问题描述】:
我在一个非常大的数据集上使用了如下的 pandas grouby mean 函数:
import pandas as pd
df=pd.read_csv("large_dataset.csv")
df.groupby(['variable']).mean()
看起来该函数没有使用多处理,因此,我实现了一个并行版本:
import pandas as pd
from multiprocessing import Pool, cpu_count
def meanFunc(tmp_name, df_input):
df_res=df_input.mean().to_frame().transpose()
return df_res
def applyParallel(dfGrouped, func):
num_process=int(cpu_count())
with Pool(num_process) as p:
ret_list=p.starmap(func, [[name, group] for name, group in dfGrouped])
return pd.concat(ret_list)
applyParallel(df.groupby(['variable']), meanFunc)
但是,pandas 实现似乎仍然比我的并行实现快方式。
我正在查看 pandas groupby 的 source code,我发现它正在使用 cython。是这个原因吗?
def _cython_agg_general(self, how, alt=None, numeric_only=True,
min_count=-1):
output = {}
for name, obj in self._iterate_slices():
is_numeric = is_numeric_dtype(obj.dtype)
if numeric_only and not is_numeric:
continue
try:
result, names = self.grouper.aggregate(obj.values, how,
min_count=min_count)
except AssertionError as e:
raise GroupByError(str(e))
output[name] = self._try_cast(result, obj)
if len(output) == 0:
raise DataError('No numeric types to aggregate')
return self._wrap_aggregated_output(output, names)
【问题讨论】:
-
我猜主要原因是您的代码必须花费大量时间将“本机”Pandas 数据帧(C 对象)转换为 Python 对象并返回。
标签: python python-3.x pandas cython pandas-groupby