代码之家  ›  专栏  ›  技术社区  ›  M Hossain

在两列上使用pandas groupby如何派生新列

  •  2
  • M Hossain  · 技术社区  · 7 年前

    我有一个包含许多列的数据集,我想基于该数据集上的两列创建一个新列。

       train_data[['CtpJobId', 'SegmentId']]
    
         CtpJobId     SegmentId
    0   qa1-9epx-dk1    347772
    1   qa1-9epx-dv1    347774
    2   qa1-9epx-dv1    347777
    3   qa1-9epx-dv1    347780
    4   qa1-9epx-dv1    347783
    5   qa1-9epx-dv1    347786
    6   qa1-9epx-dv1    347789
    7   qa1-9epx-dv1    347792
    8   qa1-9epx-e01    347794
    9   qa1-9epx-eb2    347795
    10  qa1-9epx-ez1    347796
    11  qa1-9epx-f32    347797
    12  qa1-9epx-fi1    347798
    

    现在,我想创建一个名为numberofsegment的新列,例如,如果同一个jobid有多个segmentid,则聚合该segmentid并将其总和插入到新列中。

          CtpJobId        SegmentId    numberOfSegment
    0   qa1-9epx-dk1    347772             1
    1   qa1-9epx-dv1    347774             7
    2   qa1-9epx-dv1    347777             7
    3   qa1-9epx-dv1    347780             7
    4   qa1-9epx-dv1    347783             7
    5   qa1-9epx-dv1    347786             7
    6   qa1-9epx-dv1    347789             7
    7   qa1-9epx-dv1    347792             7
    8   qa1-9epx-e01    347794             1
    9   qa1-9epx-eb2    347795             1
    10  qa1-9epx-ez1    347796             1
    11  qa1-9epx-f32    347797             1
    

    我用了一种方法,但它错了

    train_data['NumberOfSegment'] = train_data.groupby('CtpJobId')['SegmentId'].sum()
    
     train_data[['CtpJobId','NumberOfSegment']]
    
       CtpJobId    NumberOfSegment
    0   qa1-9epx-dk1    NaN
    1   qa1-9epx-dv1    NaN
    2   qa1-9epx-dv1    NaN
    3   qa1-9epx-dv1    NaN
    4   qa1-9epx-dv1    NaN
    5   qa1-9epx-dv1    NaN
    6   qa1-9epx-dv1    NaN
    7   qa1-9epx-dv1    NaN
    8   qa1-9epx-e01    NaN
    9   qa1-9epx-eb2    NaN
    10  qa1-9epx-ez1    NaN
    

    有人能帮我吗?提前谢谢

    3 回复  |  直到 7 年前
        1
  •  3
  •   Ashish Acharya    7 年前

    你需要使用 transform 具有 'count' 是的。

    train_data['NumberOfSegment'] = train_data.groupby('CtpJobId')['SegmentId'].transform('count')
    

    输出:

            CtpJobId  SegmentId  NumberOfSegment
    0   qa1-9epx-dk1     347772                1
    1   qa1-9epx-dv1     347774                7
    2   qa1-9epx-dv1     347777                7
    3   qa1-9epx-dv1     347780                7
    4   qa1-9epx-dv1     347783                7
    5   qa1-9epx-dv1     347786                7
    6   qa1-9epx-dv1     347789                7
    7   qa1-9epx-dv1     347792                7
    8   qa1-9epx-e01     347794                1
    9   qa1-9epx-eb2     347795                1
    10  qa1-9epx-ez1     347796                1
    11  qa1-9epx-f32     347797                1
    12  qa1-9epx-fi1     347798                1
    
        2
  •  4
  •   cs95 abhishek58g    7 年前

    你也可以 map value_counts 结果到“ctpjobid”:

    df['NumberOfSegment'] = df.CtpJobId.map(df.CtpJobId.value_counts())    
    df
    
            CtpJobId  SegmentId  NumberOfSegment
    0   qa1-9epx-dk1     347772                1
    1   qa1-9epx-dv1     347774                7
    2   qa1-9epx-dv1     347777                7
    3   qa1-9epx-dv1     347780                7
    4   qa1-9epx-dv1     347783                7
    5   qa1-9epx-dv1     347786                7
    6   qa1-9epx-dv1     347789                7
    7   qa1-9epx-dv1     347792                7
    8   qa1-9epx-e01     347794                1
    9   qa1-9epx-eb2     347795                1
    10  qa1-9epx-ez1     347796                1
    11  qa1-9epx-f32     347797                1
    12  qa1-9epx-fi1     347798                1
    
        3
  •  3
  •   user3483203    7 年前

    你需要 groupby transform

    df.groupby('CtpJobId').SegmentId.transform('count')
    
    0     1
    1     7
    2     7
    3     7
    4     7
    5     7
    6     7
    7     7
    8     1
    9     1
    10    1
    11    1
    12    1
    Name: SegmentId, dtype: int64