【问题标题】:Add a new column with lowest value within groups在组中添加一个具有最低值的新列
【发布时间】:2021-11-26 19:48:54
【问题描述】:

我有一个数据框,例如:

Groups Value Element 
G1     1     A
G1     4     B
G1     6     C
G2     2     D
G2     1     E
G3     7     F
G3     4     G
G3     2     H
G3     2     I 

我想添加一个名为 first_Element 的新列,如果有前任,这将是 Elementlowest Value 的每个 Groups aequo,然后拿第一个。

然后我应该得到:

Groups Value Element first_Element
G1     1     A       A
G1     4     B       A
G1     6     C       A
G2     2     D       E
G2     1     E       E
G3     7     F       H
G3     4     G       H
G3     2     H       H
G3     2     I       H

请问有人有意见吗?

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    用户groupby().transformidxmin,然后loc 访问:

    min_loc = df.groupby('Groups')['Value'].transform('idxmin')
    
    df['first_element'] = df.loc[min_loc, 'Element'].to_numpy()
    

    输出:

      Groups  Value Element first_element
    0     G1      1       A             A
    1     G1      4       B             A
    2     G1      6       C             A
    3     G2      2       D             E
    4     G2      1       E             E
    5     G3      7       F             H
    6     G3      4       G             H
    7     G3      2       H             H
    8     G3      2       I             H
    

    【讨论】:

      【解决方案2】:
      df = df.merge(pd.DataFrame(df.groupby('Groups').apply(lambda x: x['Element'][x['Value'].idxmin()]), columns=['first_Element']).reset_index(), on='Groups')
      

      输出:

      >>> df
        Groups  Value Element first_Element
      0     G1      1       A             A
      1     G1      4       B             A
      2     G1      6       C             A
      3     G2      2       D             E
      4     G2      1       E             E
      5     G3      7       F             H
      6     G3      4       G             H
      7     G3      2       H             H
      8     G3      2       I             H
      

      【讨论】:

        【解决方案3】:

        这是使用地图的一种方式:

        (df.assign(first_Element = df['Groups'].map(df.loc[df.groupby('Groups')['Value'].idxmin()]
                                                    .set_index('Groups')['Element'])))
        

        【讨论】:

          【解决方案4】:

          一个选项是对值进行排序,分组,然后选择每组的第一个值:

          first = (df.sort_values(['Groups', 'Value'])
                     .groupby('Groups', sort = False)
                     .Element
                     .transform('first')
                   )
          df.assign(first_Element = first)
           
            Groups  Value Element first_Element
          0     G1      1       A             A
          1     G1      4       B             A
          2     G1      6       C             A
          3     G2      2       D             E
          4     G2      1       E             E
          5     G3      7       F             H
          6     G3      4       G             H
          7     G3      2       H             H
          8     G3      2       I             H
          

          另一个选项是对值进行排序,删除重复项并合并回原始数据框;这避免了 groupby,可能更有效(只是一个假设):

          trimmed = (df.sort_values(['Groups', 'Value'])
                       .drop(columns='Value')
                       .drop_duplicates(subset='Groups')
                       .rename(columns={'Element':'first_Element'})
                     )
          
          df.merge(trimmed, on='Groups')
           
            Groups  Value Element first_Element
          0     G1      1       A             A
          1     G1      4       B             A
          2     G1      6       C             A
          3     G2      2       D             E
          4     G2      1       E             E
          5     G3      7       F             H
          6     G3      4       G             H
          7     G3      2       H             H
          8     G3      2       I             H
          
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-12-01
            • 2016-11-03
            • 2021-08-19
            • 2021-12-11
            • 2022-01-26
            • 2022-01-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多