代码之家  ›  专栏  ›  技术社区  ›  Giora Simchoni

获取对应于大熊猫组中max的行groupby

  •  2
  • Giora Simchoni  · 技术社区  · 7 年前

    简单数据帧:

    df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']})
    df
       A  B  C
    0  1  0  a
    1  1  1  b
    2  2  2  c
    3  2  3  d
    

    我希望每一个价值( groupby )对于A列,获取C列的值,其中B列是最大值。例如,对于A列的组1,B列的最大值是1,所以我想要C列的值“B”:

       A  C
    0  1  b
    1  2  d
    

    不需要假设列B是排序的,性能是最优先的,然后是优雅的。

    4 回复  |  直到 7 年前
        1
  •  3
  •   BENY    7 年前

    用支票 sort_values + drop_duplicates

    df.sort_values('B').drop_duplicates(['A'],keep='last')
    Out[127]: 
       A  B  C
    1  1  1  b
    3  2  3  d
    
        2
  •  3
  •   Jondiedoop    7 年前
    df.groupby('A').apply(lambda x: x.loc[x['B'].idxmax(), 'C'])
    #    A
    #1    b
    #2    d
    

    使用 idxmax 查找索引的位置 B 是最大值,然后选择列 C 在该组中(使用lambda函数

        3
  •  3
  •   cs95 abhishek58g    7 年前

    这里有点好玩 groupby nlargest :

    (df.set_index('C')
       .groupby('A')['B']
       .nlargest(1)
       .index
       .to_frame()
       .reset_index(drop=True))
    
       A  C
    0  1  b
    1  2  d
    

    或者, sort_values , 子句 last :

    df.sort_values('B').groupby('A')['C'].last().reset_index()
    
       A  C
    0  1  b
    1  2  d
    
        4
  •  1
  •   user3483203    7 年前

    类似于@jondiedoop的解决方案,但避免了 apply :

    u = df.groupby('A')['B'].idxmax()
    
    df.loc[u, ['A', 'C']].reset_index(drop=1)
    

       A  C
    0  1  b
    1  2  d