在两列上使用熊猫分组如何派生新列



我有一个有很多列的数据集,我想根据该数据集上的两列创建一个新列。

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

任何人都可以帮我吗?提前致谢

您也可以map"CtpJobId" 的value_counts结果:

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

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

你需要groupbytransform

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 

最新更新