代码之家  ›  专栏  ›  技术社区  ›  Shaunak

如何对熊猫进行分组、排序,然后取回熊猫中第二高的一行?

  •  1
  • Shaunak  · 技术社区  · 7 年前

    ID Offer 列,然后获取第二行。我如何使用熊猫实现这一点?

         ID             Vehicle              Auction       Offer
    0   3580845  2005 Volvo XC90 V8               Copart    215
    1   3580845  2005 Volvo XC90 V8  Manheim Salvage API    170
    2   3580845  2005 Volvo XC90 V8       Merged Salvage    195
    3   3580845  2005 Volvo XC90 V8      Manheim Salvage    390
    4   3580845  2005 Volvo XC90 V8                  IAA    270
    5   3580845  2005 Volvo XC90 V8                  SVP    175
    6   3580789   2003 Lexus ES 300               Copart    180
    7   3580789   2003 Lexus ES 300       Merged Salvage    190
    8   3580789   2003 Lexus ES 300      Manheim Salvage    355
    9   3580789   2003 Lexus ES 300                  IAA    270
    10  3580789   2003 Lexus ES 300                  SVP    180
    

         ID             Vehicle              Auction       Offer
    0   3580845  2005 Volvo XC90 V8                  IAA    270
    1   3580789   2003 Lexus ES 300                  IAA    270
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   jezrael    7 年前

    sort_values 然后使用 cumcount 用于计数值,然后按筛选 boolean indexing

    df = df.sort_values(['ID','Offer'], ascending=False)
    df1 = df[df.groupby('ID').cumcount() == 1]
    print (df1)
                 ID        Vehicle Auction  Offer
    4 3580845  2005  Volvo XC90 V8     IAA    270
    9 3580789  2003   Lexus ES 300     IAA    270
    
        2
  •  1
  •   Clock Slave    7 年前

    groupby rank 结合使用。

    from io import StringIO
    import pandas as pd
    
    data = pd.read_table(StringIO("""ID Vehicle Auction Offer
    3580845 2005VolvoXC90V8 Copart 215
    3580845 2005VolvoXC90V8 ManheimSalvageAPI 170
    3580845 2005VolvoXC90V8 MergedSalvage 195
    3580845 2005VolvoXC90V8 ManheimSalvage 390
    3580845 2005VolvoXC90V8 IAA 270
    3580845 2005VolvoXC90V8 SVP 175
    3580789 2003LexusES300 Copart 180
    3580789 2003LexusES300 MergedSalvage 190
    3580789 2003LexusES300 ManheimSalvage 355
    3580789 2003LexusES300 IAA 270
    3580789 2003LexusES300 SVP 180"""), sep=' ')
    
    offer_rank_by_id = data.groupby('ID').rank(method = 'min', ascending = False).loc[:,'Offer'] == 2 # using 2 because we want to select the second highest offer for each id
    
    data.loc[offer_rank_by_id,:]
    
    #         ID          Vehicle Auction  Offer
    # 4  3580845  2005VolvoXC90V8     IAA    270
    # 9  3580789   2003LexusES300     IAA    270