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

2024-10-03 00:23:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

   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

有人能帮我吗?提前谢谢


Tags: 数据datatrainnansegmentide01f32eb2
3条回答

你需要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 

您还可以将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

您需要将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

相关问题 更多 >