使用条件过滤器对熊猫群进行矢量化

时间:2018-06-22 00:52:12

标签: python pandas optimization group-by vectorization

假设我有一个示例df,例如:

df = pd.DataFrame([['William', 1, 0, 'T', 0, 1],['James', 0, 1, 'R', 1, 1],['James', 1, 0, 'S', 0, 1],['Dean', 1, 0, 'R', 1, 0],['William', 0, 1, 'S', 0, 0],['James', 0, 0, 'S', 0, 1]],columns=['Name','x1','x2','x3','x4','x5'])

哪个给:

      Name  x1  x2 x3  x4  x5
0  William   1   0  T   0   1
1    James   0   1  R   1   1
2    James   1   0  S   0   1
3     Dean   1   0  R   1   0
4  William   0   1  S   0   0
5    James   0   0  S   0   1

现在,我想按Name对数据框进行分组,所以:

grouped = df.groupby('Name')

然后,我想遍历变量列表并对每个组进行一些计算,使用这些变量中的每个作为列名,并对传递的组应用特定的过滤器,例如:

def my_function(x, i):

    stats = [x[i].sum(),
            x[x['x3']=='L'][i].sum(),
            x[x['x3']=='R'][i].sum(),
            x[(x['x2']==1) | (x['x4']==1) | (x['x5']==1)][i].sum(),
            x[x['x2']==1][i].sum(),
            x[x['x2']==0][i].sum(),
            x[x['x5']==1][i].sum()]

    return pd.Series(stats)

for i in ['x1','x2','x4','x5']:
    out = grouped.apply(lambda x: my_function(x, i))

对于小型示例数据框,这似乎执行得很快,但是对于具有〜5000列,〜50行和〜20个唯一名称的数据框,这可能需要花费大量时间才能完成。我知道这种方法可能有矢量化或优化的机会。

是否知道对外部循环中的每个变量都需要以相同的方式过滤数据,是否有一种方法可以对上述过程进行矢量化处理?

任何指导将不胜感激。

编辑(在Wen的评论之后):

我将要在原始df上执行的变量和条件过滤器放置在单独的列表中,然后对所得的已过滤数据帧执行了groupby(),并为每个过滤器计算了相应的sum()变量。

variables = ['x1','x2','x4','x5']
filters = [df['x3']=='S', df['x3']=='R', (df['x2']==1) | (df['x4']==1) | (df['x5']==1), df['x2']==1, df['x2']==0, df['x5']==1]

out = [df[i].groupby('Name')[j].sum() for i in filters for j in variables]

我想我只需要将输出concat放入单个输出数据帧中,但是对于未返回总和的情况,这会插入缺失值吗?例如,'Dean'不会为df['x3']=='S'返回0,有办法吗?

0 个答案:

没有答案