我有一个大熊猫的车辆坐标数据框(多天来自多辆车)。对于每辆车和每天,我做两件事:要么对它应用算法,要么如果它不满足某些标准则完全从数据集中过滤掉它。
为了实现这一点,我使用df.groupby('vehicle_id', 'day')
,然后使用.apply(algorithm)
或.filter(condition)
,其中algorithm
和condition
是接收数据帧的函数。
我希望我的数据集(涉及多个.apply
和.filter
步骤)的完整处理以一种明确的方式写出来,而不是强制循环遍历这些组,目标是整个事情看起来像:
df.group_by('vehicle_id', 'day').apply(algorithm1).filter(condition1).apply(algorithm2).filter(condition2)
当然,上面的代码不正确,因为.apply()
和.filter()
会返回新的数据帧,这正是我的问题所在。它们将所有数据返回到单个数据帧中,我发现我已连续应用.groupby('vehicle_id', 'day')
。
有没有一种很好的方式可以写出来,而不必一遍又一遍地按相同的列分组?
答案 0 :(得分:0)
由于apply
无论如何都使用for循环(意味着后台没有复杂的优化),我建议使用实际的for循环:
arr = []
for key, dfg in df.groupby(['vehicle_id', 'day']):
dfg = dfg.do_stuff1() # Perform all needed operations
dfg = do_stuff2(dfg) #
arr.append(dfg)
result = pd.concat(arr)
另一种方法是创建一个函数,该函数在给定的数据帧上按顺序运行所有apply和filters,然后映射单个groupby / apply到它:
def all_operations(dfg):
# Do stuff
return result_df
result = df.group_by(['vehicle_id', 'day']).apply(all_operations)
在这两个选项中,您将不得不处理从过滤器返回空数据帧的情况(如果存在这种情况)。