Python 熊猫-按组/按组扩展+;在整个数据帧(所有列)上展开窗口

Python 熊猫-按组/按组扩展+;在整个数据帧(所有列)上展开窗口,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个以下结构的数据帧(时间列是实际时间,如果有关系的话): 我想做的是: 分组依据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 (idea

我有一个以下结构的数据帧(时间列是实际时间,如果有关系的话):

我想做的是:

  • 分组依据
    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(组df,聚合dict):
    对于集合中的列、函数:
    
    agg_dict[col]=[lambda-df:f(df[df[time1]这个问题有点模糊,但我认为你可以做例如
    df.loc[df['time1'].lt(df['time2']]].groupby('group').expansing(1).agg({'attr1':[lambda x:x.max()-x.min(),'sum'],'attr2':'std'))
    ,然后重新编制索引以适应原始索引。@Ben.T我不能这样做,我需要在组内进行筛选。因为筛选取决于组?正如@Ben.T建议的那样,在应用
    groupby
    +
    展开后,您可以
    reindex
    并可能执行
    ffill
    来填充缺少的值我想这应该行得通。@Ben.T正因为如此。更详细地说,我实际上对每个分组的数据帧都做了类似于
    df[df[time1]
    的事情。也许我应该编辑这个问题,让它更清楚。这个问题有点模糊,但我认为你可以做例如
    df.loc[df['time1'].lt(df['time2'])。groupby('group')。扩展(1).agg({'attr1':[lambda x:x.max()-x.min(),'sum'],'attr2':'std'})
    ,然后重新编制索引以适应原始索引。@Ben.T我不能这样做,我需要在组内进行筛选。因为筛选取决于组?正如@Ben.T建议的那样,在应用
    groupby
    +
    展开后,您可以
    reindex
    并可能执行
    ffill
    来填充缺少的值我想这应该行得通。@Ben.T正因为如此。更详细地说,我实际上对每个分组的数据帧执行类似于
    df[df[time1]
    的操作。也许我应该编辑这个问题以使其更清楚。
     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)