熊猫-在整个数据框(所有列)上按/扩展分组+扩展窗口

时间:2020-09-03 12:25:43

标签: python pandas dataframe pandas-groupby

我有一个具有以下结构的数据框(时间列是实际时间,如果需要的话):

group  |  attr1  | attr2  | time1  | time2
--------------------------------------------
1      |  1      | 7      | 1      | 2
1      |  4      | 4      | 4      | 7
1      |  3      | 3      | 6      | 9
2      |  2      | 2      | 2      | 5
2      |  2      | 5      | 3      | 6
2      |  1      | 6      | 4      | 7
2      |  4      | 2      | 5      | 8
3      |  6      | 7      | 6      | 10

我想做的是以下事情:

  1. group

    分组
  2. 对于每个组数据帧:

    2.1。在整个数据框(所有列)上应用扩展窗口

    2.2。对于每个“扩展”数据框

     2.2.1. Filter the 'expanding' dataframe using time1 & time2 columns (e.g. `df[df[time1]<df[time2]]`)
     2.2.2. Perform various aggregations (ideally using `.agg` with `dict` argument, as there are many different aggregations for many columns)
    
  3. 输出与输入的行数基本相同

我的问题是:

  1. 我没有指定“扩展分组列”的方法。如果可以的话,我可以做类似的事情:
def func(group_df, agg_dict):
   group_df_filtered = filter the dataframe on time columns
   return group_df_filtered.agg(agg_dict)

df.groupby(['group', expanding(1)]).apply(func, agg_dict=agg_dict)
  1. 我看不到对整个数据框执行扩展操作的方法。如果可以的话,我可以做:
def func(group_df, agg_dict):
    for col, funcs in agg_dict:
        agg_dict[col] = [lambda df: f(df[df[time1]<df[time2]]) for f in funcs]

    return group_df.expanding(1).agg(agg_dict)

df.groupby('group').apply(func, agg_dict=agg_dict)

我找到了一种与第二种方法类似的解决方法,除了我将整列传递给func并进行子集设置(因为我拥有整列而不只是扩展部分)并在函数内部进行过滤,但速度非常慢,主要是因为我将函数包装在一起,并且有很多自定义代码。

是否有一种很好且最重要的快速方式来实现我需要的功能?我猜想它需要尽可能少的纯python代码才能相对较快地工作(我使用aggdict而不是例如逐行或类似地进行应用的原因之一,这会杀死性能,另一个原因是我在不同的列上有多个函数,因此每次手动实现都会太冗长。)

0 个答案:

没有答案