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