Использование pandas groupby на двух столбцах как создать новый столбец


У меня есть Dataset, который имеет много столбцов, и я хочу создать новый столбец на основе двух столбцов в этом наборе данных.

   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 имеет несколько сегментов, а затем агрегировать этот сегмент и вставить эту сумму в этот новый столбец.

      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 2

3 ответа:

Вам нужно использовать преобразование с '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

Вы также можете map A 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

Вам нужно 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