【问题标题】:Pandas: Calculate Median Based on Multiple Conditions in Each RowPandas:根据每行中的多个条件计算中位数
【发布时间】:2020-09-21 12:42:28
【问题描述】:

我正在尝试根据数据框每一行中的多个条件即时计算中值,但我没有到达那里。

基本上,对于每一行,我都在计算同一部门中 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 计数”代码计算每个部门中工资高于每个 A 的 B 的数量。这部分工作正常。然后,我想要构建“B 中位数”列,计算每个部门中 B 的中位数工资,其工资高于同一部门中每个 A 的工资。

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        

【问题讨论】:

  • 请与预期输出共享示例数据。数据,而不是图片。
  • 好的,我添加了一些带有更多上下文的假数据。

标签: python pandas dataframe conditional-statements median


【解决方案1】:

嗯,我可以用函数做我想做的事:

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)

你们中有人知道实现这一结果的更好方法吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2020-11-21
    • 1970-01-01
    • 2018-11-09
    • 2021-09-21
    • 2021-10-24
    • 1970-01-01
    相关资源
    最近更新 更多