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

熊猫:如何将索引设置为列值、对列进行分组和返回值[重复]

  •  1
  • Gusta  · 技术社区  · 3 年前

    我的df如下所示:

             State  Country   Pop       GDP
       1     MD     USA        433100   1222
       2     TX     USA        99934123 324234
       3     B.C.   MEX        324599   5343
       4     OAX    MEX        43322    986
       5     BC     CAN        3431     643
       6     NS     CAN        8749     3535
    

    我想按国家分组,找到最大GDP和最小GDP,返回它们以及新的列名,这样看起来像这样:

          PoorState   GDP    Pop       RichState   GDP      Pop
    USA   MD          1222   433100    TX          324234   99934123
    MEX   OAX         986    43322     B.C.        5343     324599
    ... 
    

    我尝试了以下方法来获取每个状态的最小值和最大值:

    df.groupby('state').agg({'GDP':min, 'GDP':max})[['GDP','GDP']].reset_index()
    

    但只有最小值起作用,而最大值不起作用。

      State   GDP    GDP
      MD      1222   1222
      OAX     986    986
    

    -- 我知道我可以这样做来设置索引: newdf = df.set_index('region')

    我想我在想我是否能在一条线上完成这一切。

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

    我们能做到 groupby 具有 rank 然后创建类别 pivot

    df['new'] =  df.groupby('Country')['GDP'].rank().map({1:'Poor',2:'Rich'})
    out = df.pivot(index='Country',columns = 'new').sort_index(level=1,axis=1)
    out.columns = out.columns.map('_'.join)
    out.reset_index(inplace=True)
    out
    Out[348]: 
      Country  GDP_Poor  Pop_Poor State_Poor  GDP_Rich  Pop_Rich State_Rich
    0     CAN       643      3431         BC      3535      8749         NS
    1     MEX       986     43322        OAX      5343    324599       B.C.
    2     USA      1222    433100         MD    324234  99934123         TX