Groupby列和Apply函数到其他列Pandas

vhmi4jdf  于 2023-10-14  发布在  其他
关注(0)|答案(1)|浏览(99)

我想groupby一个特定的列,然后应用一个函数到多个其他列。我希望函数分别遍历每列(Q1,Q2,Q3,Q4,Q5,Q6),并且(a):在每一列中只删除NaN单元格,(B)找出每一列中4的总数,然后(c)将每一列中4的总数除以该列中值的总数。
我尝试了以下方法(如下),但不起作用。由于某种原因,它无法识别我试图在每列中找到4的数量。我还希望能够对多个列执行此操作,而不仅仅是一个。

df.groupby('Team_Name').apply(lambda x: x['Q1'][4]/x['Q1'].sum()).values
print(df)
qni6mghb

qni6mghb1#

您可以通过DataFrame.filter比较过滤列,通过4比较并获得每组mean

print (df)
    Q1  Q2   Q3 Team_Name
0  NaN   4  NaN     team1
1  4.0   8  7.0     team1
2  4.0   4  NaN     team1
3  4.0   0  4.0     team1
4  1.0   2  NaN     team2
5  4.0   4  7.0     team2
6  8.0   4  NaN     team2
7  1.0   4  2.0     team2

out = df.filter(like='Q').eq(4).groupby(df['Team_Name']).mean()
print (out)
             Q1    Q2    Q3
Team_Name                  
team1      0.75  0.50  0.25
team2      0.25  0.75  0.00

如果需要,如果计算列中的值的总数,则忽略NaN s计算4的数量乘以聚合sum,然后除以没有NaN s的值的数量:

df1 = df.filter(like='Q')

out1 = (df1.eq(4).groupby(df['Team_Name']).sum()
                 .div(df1.notna().groupby(df['Team_Name']).sum()))
print (out1)
             Q1    Q2   Q3
Team_Name                 
team1      1.00  0.50  0.5
team2      0.25  0.75  0.0

使用lambda函数的Slowier解决方案:

out2 = df.filter(like='Q').groupby(df['Team_Name']).agg(lambda x: x.dropna().eq(4).mean())
print (out2)
             Q1    Q2   Q3
Team_Name                 
team1      1.00  0.50  0.5
team2      0.25  0.75  0.0

为了完整性,你的解决方案应该由lambda函数来改变,但是它很慢,所以不推荐:

out3 = df.filter(like='Q').groupby(df['Team_Name']).agg(lambda x: x.eq(4).sum()/x.size)
print (out3)
             Q1    Q2    Q3
Team_Name                  
team1      0.75  0.50  0.25
team2      0.25  0.75  0.00

out4 = df.filter(like='Q').groupby(df['Team_Name']).agg(lambda x: x.eq(4).sum()/x.count())
print (out4)
             Q1    Q2   Q3
Team_Name                 
team1      1.00  0.50  0.5
team2      0.25  0.75  0.0

相关问题