以声明式处理pandas数据

Chr*_*ais 5 declarative dataframe pandas

我有一个大熊猫的车辆坐标数据框(多天来自多辆车).对于每辆车和每天,我做两件事:要么对它应用算法,要么如果它不满足某些标准则完全从数据集中过滤掉它.

为了实现这一点,我使用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')连续申请了.

有没有一种很好的方式可以写出来,而不必一遍又一遍地按相同的列分组?

Sho*_*alt 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)
Run Code Online (Sandbox Code Playgroud)

另一种方法是创建一个函数,该函数在给定的数据帧上按顺序运行所有应用和过滤器,然后将单个 groupby/apply 映射到它:

def all_operations(dfg):
    # Do stuff
    return result_df

result = df.group_by(['vehicle_id', 'day']).apply(all_operations)
Run Code Online (Sandbox Code Playgroud)

在这两个选项中,您都必须处理从过滤器返回空数据帧的情况(如果存在这种情况)。