我曾经在之后rosetta.parallel.pandas_easy
进行并行化,例如:apply``groupby
from rosetta.parallel.pandas_easy import groupby_to_series_to_frame
df = pd.DataFrame({'a': [6, 2, 2], 'b': [4, 5, 6]},index= ['g1', 'g1', 'g2'])
groupby_to_series_to_frame(df, np.mean, n_jobs=8, use_apply=True, by=df.index)
但是,有没有人想出如何并行化返回DataFrame的函数?rosetta
如预期,此代码对于失败。
def tmpFunc(df):
df['c'] = df.a + df.b
return df
df.groupby(df.index).apply(tmpFunc)
groupby_to_series_to_frame(df, tmpFunc, n_jobs=1, use_apply=True, by=df.index)
尽管确实应该将其内置到熊猫中,但这似乎可行
import pandas as pd
from joblib import Parallel, delayed
import multiprocessing
def tmpFunc(df):
df['c'] = df.a + df.b
return df
def applyParallel(dfGrouped, func):
retLst = Parallel(n_jobs=multiprocessing.cpu_count())(delayed(func)(group) for name, group in dfGrouped)
return pd.concat(retLst)
if __name__ == '__main__':
df = pd.DataFrame({'a': [6, 2, 2], 'b': [4, 5, 6]},index= ['g1', 'g1', 'g2'])
print 'parallel version: '
print applyParallel(df.groupby(df.index), tmpFunc)
print 'regular version: '
print df.groupby(df.index).apply(tmpFunc)
print 'ideal version (does not work): '
print df.groupby(df.index).applyParallel(tmpFunc)
问题内容: 我想并行化以下代码: 由于每一行都可以独立处理,因此我尝试使用它,但是我不知道如何共享DataFrame。我也不确定这是否是与熊猫并行化的最佳方法。有什么帮助吗? 问题答案: 就像@Khris在他的评论中说的那样,您应该将数据帧分成几个大块,并并行地遍历每个块。您可以将数据帧任意分成随机大小的块,但是根据您计划使用的进程数将数据帧分成大小相等的块更有意义。幸运的是,已经有人想出了如何为
问题内容: 我知道必须在某些地方回答此问题,但我找不到它。 问题 :groupby操作后对每个组进行采样。 问题答案: 应用lambda并使用param调用:
我正在使用此数据框: 我想通过名称和水果将其聚合,得到每个名称的水果总数。 我试着按名字和水果分组,但如何得到水果的总数呢。
问题内容: 如何对pandas groupby操作应用排序?下面的命令返回一个错误,指出“布尔”对象不可调用 问题答案: 通常,排序是在groupby键上执行的,并且您发现您无法调用groupby对象,您可以做的是调用并传递函数并将列作为kwarg参数传递: 另外,您可以在分组之前对df进行排序: 更新资料 对于不建议使用的版本,请参见docs,现在应使用: 在这里在评论中添加@xgdgsc的答案
我想分配一个组的第一行。 输入: 我尝试了: 但是我只得到第一排。 我想要这样的输出:
问题内容: 我的数据有年龄,还有每月付款。 我正在尝试汇总付款总额,但不汇总年龄(平均有效)。 是否可以对不同的列使用不同的功能? 问题答案: 您可以将列名作为键,将想要的函数作为值传递给字典。