【问题标题】:Pandas Dataframe get maximum with respect to other entries [duplicate]Pandas Dataframe 相对于其他条目获得最大值 [重复]
【发布时间】:2022-10-24 06:15:36
【问题描述】:

我有一个这样的数据框:

name phase value
BOB 1 .9
BOB 2 .05
BOB 3 .05
JOHN 2 .45
JOHN 3 .45
JOHN 4 .05
FRANK 1 .4
FRANK 3 .6

我想找到“阶段”列中的哪个条目在“值”列中具有最大值。
如果多个共享相同的最大值,则保留第一个或随机值作为“相位”。


期望结果表:

name phase value
BOB 1 .9
JOHN 2 .45
FRANK 3 .6

我的方法是:

df.groupby(['name'])[['phase','value']].max() 

但它返回了不正确的值。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    你不需要使用groupby。按valuephase 对值进行排序(必要时调整顺序)并按name 删除重复项:

    out = (df.sort_values(['value', 'phase'], ascending=[False, True])
             .drop_duplicates('name')
             .sort_index(ignore_index=True))
    print(out)
    
    # Output
        name  phase  value
    0    BOB      1   0.90
    1   JOHN      2   0.45
    2  FRANK      3   0.60
    

    【讨论】:

      【解决方案2】:

      尝试先对数据框进行排序:

      df = df.sort_values(
          by=["name", "value", "phase"], ascending=[True, False, True]
      )
      
      x = df.groupby("name", as_index=False).first()
      print(x)
      

      印刷:

          name  phase  value
      0    BOB      1   0.90
      1  FRANK      1   0.60
      2   JOHN      1   0.45
      

      【讨论】:

      • 现在比apply('first') 好:)
      • @Corralien 是的,我必须摆脱我的 .apply 习惯:D 但是 .drop_duplicates 解决方案比这更好,恕我直言
      【解决方案3】:

      一个可以避免排序的可能解决方案是使用 groupby:

      df.loc[df.groupby('name', sort = False).value.idxmax()]
      
          name  phase  value
      0    BOB      1   0.90
      3   JOHN      2   0.45
      7  FRANK      3   0.60
      

      【讨论】:

        【解决方案4】:

        你可以检查

        out = df.sort_values('value',ascending=False).drop_duplicates('name').sort_index()
        Out[434]: 
            name  phase  value
        0    BOB      1   0.90
        3   JOHN      2   0.45
        7  FRANK      3   0.60
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-02
          • 2019-05-05
          • 2017-04-15
          • 2016-11-13
          • 2014-12-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多