假设我有一个示例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,有办法吗?