Pandas:基于每行中的多个条件计算中值

2024-09-22 10:20:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图根据数据帧每行中的多个条件动态计算中值,但没有达到这一点

基本上,对于每一行,我都在计算同一部门中B级员工的薪酬高于该行所列薪酬的人数。我能够使用lambda函数使计数正常工作:

df['B Count'] = df.apply(lambda x: sum(df[(df['Department'] == x['Department']) & (df['Rank'] == 'B')]['Pay'] > x['Pay']), axis=1)

但是,我现在需要计算满足这些条件的每种情况的中位数。所以在数据框的第x行,我需要所有其他匹配x['Department']和df['Rank']='B'的df['Pay']的中位数。我不能用.median()代替sum(),因为这给了我中位数,而不是工资中位数。有什么想法吗

使用下面的假数据,上面的“B计数”代码统计每个部门中B的数量,其工资高于每个A。该部分工作正常。我想要的是构建“B中位数”列,计算同一部门中薪酬高于每个A的每个部门的B中位数薪酬

Person  Department  Rank    Pay B Count B Median
1       One         A       1000    1      1500
2       One         B        800        
3       One         A        500    2      1150
4       One         A       3000    0   
5       One         B       1500        
6       Two         B       2000        
7       Two         B       1800        
8       Two         A       1500    3      1800
9       Two         B       1700        
10      Two         B       1000        

Tags: 数据lambdadfcount条件onepay部门
1条回答
网友
1楼 · 发布于 2024-09-22 10:20:29

我可以用一个函数做我想做的事情:

def median_b(x):
    if x['B Count'] == 0:
        return np.nan
    else:
        return df[(df['Department'] == x['Department']) & (df['Rank'] == 'B') & (
            df['Pay'] > x['Pay'])]['Pay'].median()

df['B Median'] = df.apply(median_b, axis = 1)

你们中有谁知道更好的方法来实现这个结果吗

相关问题 更多 >