【问题标题】:Count how many rows within the same group have a larger value in a given column for each row in Pandas DataFrame计算同一组中有多少行在 Pandas DataFrame 中的每一行的给定列中具有较大的值
【发布时间】:2020-01-28 06:20:02
【问题描述】:

我有一个带有组字段和感兴趣变量的 pandas 数据框。对于数据框中的每一行,我想计算同一组中有多少行对感兴趣的变量具有较大的值。

以下是我想要实现的示例:

import pandas as pd
df = pd.DataFrame(data = [['a',1],['a',2],['a',2],['a',3],['b',4],['b',2],['b',6]],
                  columns = ['groups','value'])
df
  groups value
0   a      1
1   a      2
2   a      2
3   a      3
4   b      4
5   b      2
6   b      6

这是我希望收到的输出:

  groups value what_i_want
0   a      1        3
1   a      2        1
2   a      2        1
3   a      3        0
4   b      4        1
5   b      2        2
6   b      6        0

我知道我可以通过遍历数据框的每一行来得到这个答案,但是我也知道遍历数据框的行是最后的手段,而且我的完整数据集要大得多,并且需要很长时间才能运行.我假设有一些方法可以使用 groupby 或 apply 来做到这一点,但我想不通。

谢谢!

【问题讨论】:

    标签: python-3.x pandas pandas-groupby


    【解决方案1】:

    IIUCrank

    (-df.value).groupby(df['groups']).rank(method='min')-1
    Out[466]: 
    0    3.0
    1    1.0
    2    1.0
    3    0.0
    4    1.0
    5    2.0
    6    0.0
    Name: value, dtype: float64
    
    #df['what i want']=(-df.value).groupby(df['groups']).rank(method='min')-1
    

    【讨论】:

    • 谢谢,这正是我需要的!
    【解决方案2】:

    对每个组使用 numpy 广播:

    def summarize(group):
        v = group['value'].values
        other = v[:, None]
        count = (other > v).sum(axis=0)
    
        return pd.DataFrame({'what_i_want': count})
    
    df.groupby('groups').apply(summarize)
    

    说明

    让我们考虑组a。我们首先将values中的元素提取到一个名为v的numpy数组中:

    v = [1, 2, 2, 3] # ndarray of shape (4,)
    

    我们希望将此数组与自身进行正交比较,并计算有多少元素大于当前元素。 [:, None] 语法是将v 提高一个额外的维度...

    other = [[1], [2], [2], [3]] # ndarray of shape (4,1)
    

    ...这样other > v 操作是可广播的,比较矩阵如下所示:

    other > v
                v:  [ 1   2   2   3 ]
    other:  [
             [1]      F   F   F   F
             [2]      T   F   F   F
             [2]      T   F   F   F
             [3]      T   T   T   F
            ]
    ----------------------------------
    sum(axis=0)       3   1   1   0
    

    【讨论】:

    • 谢谢,这可以得到我需要的东西,尽管我认为使用 .rank() 的其他答案对于这个问题来说更简单一些。我很欣赏一步一步的解释,它确实帮助我理解了它的工作原理,如果我将来遇到类似但更复杂的问题,比如 .rank() 不能使用,它应该是有用的知识!
    猜你喜欢
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多