我有一个具有以下结构的数据框(时间列是实际时间,如果需要的话):
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
我想做的是以下事情:
按group
对于每个组数据帧:
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)
输出与输入的行数基本相同
我的问题是:
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)
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代码才能相对较快地工作(我使用agg
和dict
而不是例如逐行或类似地进行应用的原因之一,这会杀死性能,另一个原因是我在不同的列上有多个函数,因此每次手动实现都会太冗长。)