【问题标题】:Python Group by multiple columns and keep other columnsPython 按多列分组并保留其他列
【发布时间】:2020-08-04 17:55:17
【问题描述】:

我有一张如下所示的表格:

City_code     City_name     Site_code      Site_capacity
AAA100      City_A          Site001         300
AAA100      City_A          Site002         600
AAA100      City_A          Site003         500
AAA200      City_B          Site004         350
AAA200      City_B          Site005         250
AAA300      City_C          Site006         800
AAA300      City_C          Site007         150
AAA300      City_C          Site008         450
AAA400      City_D          Site009         300
AAA400      City_D          Site0010        400

我想为每个城市选择 Site_capacity 值最高的站点

我已经尝试了以下代码:

df.groupby(['City_code', 'City_name'])['Site_capacity'].max()

这是它生成的输出:

City_code     City_name     
AAA100      City_A          600
AAA200      City_B          350
AAA300      City_C          800
AAA400      City_D          400

我如何创建一些看起来像这样的输出?

City_code     City_name     Site_code      Site_capacity
AAA100      City_A          Site002         600
AAA200      City_B          Site004         350
AAA300      City_C          Site006         800
AAA400      City_D          Site0010        400

【问题讨论】:

    标签: python pandas spatial-data-frame


    【解决方案1】:

    我们可以sort_values + drop_duplicates

    s = df.sort_values('Site_capacity').drop_duplicates(['City_code', 'City_name'],keep='last')
    Out[334]: 
      City_code City_name Site_code  Site_capacity
    3    AAA200    City_B   Site004            350
    9    AAA400    City_D  Site0010            400
    1    AAA100    City_A   Site002            600
    5    AAA300    City_C   Site006            800
    

    【讨论】:

      【解决方案2】:

      试试idxmax()和.loc

      print(df.loc[df.groupby(['City_code', 'City_name'])['Site_capacity'].idxmax()])
      
        City_code City_name Site_code  Site_capacity
      1    AAA100    City_A   Site002            600
      3    AAA200    City_B   Site004            350
      5    AAA300    City_C   Site006            800
      9    AAA400    City_D  Site0010            400
      

      【讨论】:

        【解决方案3】:

        试试这个:

        df.sort_values(by=['City_name','Site_capacity'], inplace=True,ascending = (True, False)) 
        df = df.drop_duplicates('City_name', keep='first')
        print(df)
        

        结果:

          City_code City_name Site_code  Site_capacity
          AAA100    City_A    Site002    600
          AAA200    City_B    Site004    350
          AAA300    City_C    Site006    800
          AAA400    City_D    Site0010   400
        

        或者如果你想保持最低值。

        df = df.drop_duplicates('City_name', keep='last')
        

        【讨论】:

        • 这和YOBEN_S的解决方案一样,只不过是两行而不是一行。
        • 没错,但看看结果。
        猜你喜欢
        • 1970-01-01
        • 2012-01-03
        • 2020-04-21
        • 2021-06-10
        • 2021-05-15
        • 2017-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多