【问题标题】:Processing pandas data in declarative style以声明式方式处理 pandas 数据
【发布时间】:2017-12-01 20:13:28
【问题描述】:

我有一个车辆坐标的 pandas 数据框(多天的多辆车)。对于每辆车和每一天,我都会做两件事:要么对其应用算法,要么在不满足某些标准时将其完全从数据集中过滤掉。

为了实现这一点,我使用df.groupby('vehicle_id', 'day'),然后使用.apply(algorithm).filter(condition),其中algorithmcondition 是接收数据帧的函数。

我希望我的数据集的完整处理(涉及多个 .apply.filter 步骤)以声明式的方式写出来,而不是强制循环遍历组,以实现整个事情的目标看起来像:

df.group_by('vehicle_id', 'day').apply(algorithm1).filter(condition1).apply(algorithm2).filter(condition2)

当然,上面的代码是不正确的,因为.apply().filter() 返回了新的数据帧,这正是我的问题。他们将所有数据返回到一个数据框中,我发现我已经连续申请了.groupby('vehicle_id', 'day')

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

【问题讨论】:

    标签: pandas dataframe declarative


    【解决方案1】:

    由于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)
    

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

    def all_operations(dfg):
        # Do stuff
        return result_df
    
    result = df.group_by(['vehicle_id', 'day']).apply(all_operations)
    

    在这两个选项中,如果存在这种情况,您将不得不处理从过滤器返回空数据帧的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      相关资源
      最近更新 更多