我有一个熊猫数据框。我使用groupBy
(在1列)+ apply
组合向数据框添加新列。 apply通过参数调用一个自定义函数。完整的调用看起来是这样的:熊猫dataframe groupby + apply +新列慢
df = df.groupby('id').apply(lambda x: customFunction(x,'searchString'))
自定义功能的工作原理如下:基于一个if
else
情况下,新列要么充满了1
或0
。然后该团队返回。广义一点,自定义函数如下:
def customFunction(group,searchString):
#print(group.iloc[[0]]['id'].values[0])
if len(group[(group['name'] == searchString)) > 0:
group['newColumn'] = 1
else:
group['newColumn'] = 0
return group
我的问题是,脚本运行比较长,即使我不真的多的数据处理。这些是我的数据的统计数据: 数据帧有3130行和49列。 groupBy生成1499个独立的组。
如果我在customFunction
中输出了一些调试文本,我观察到通过每个组的实际迭代非常快,但在最后它需要几秒(比迭代本身更长),直到groupBy
实际完成。我认为这与重新索引或重新分配新列中的新数据有关。
我的问题,现在:
- 为什么
groupBy
+apply
需要这么长时间?为什么实际迭代已经完成的部分需要很长时间? - 如何避免这个瓶颈?我如何改进我的代码(见上文)以更快地执行?
- 更一般地说:如何将模式“按特定列分组然后添加基于条件的新列”可以最有效地实现?也许有一种方法是创建一个单独的数据结构,而不需要返回组。然后,在一个单独的步骤中,新计算的数据结构可以与原始数据框结合。但是,我不太确定这是否会更好。
我已阅读,应避免回组,因为它需要很长,但我觉得在我的情况下,它是必要的,因为我明确我customFunction
生成新的数据,而这需要返回数据。
请将样本数据 –
尝试在应用函数之前对其进行聚合:'df.groupby('id')。sum()。apply(...)' –
需要很长的时间,因为每行都会调用您的自定义函数。你想做什么?应该可以使用更快的技术。 –