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

Python 在两列上使用pandas groupby如何派生新列,python,pandas,data-science,Python,Pandas,Data Science,我有一个数据集,它有许多列,我想基于该数据集上的两列创建一个新列 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

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

   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
有人能帮我吗?提前感谢

您需要与
'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

您需要
groupby
转换

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 

您还可以
值\u计数
结果映射到“CtpJobId”:


这是下面列出的最佳答案+1@MHossain我明白,不用担心
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