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

时间:2018-07-18 15:55:53

标签: 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-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

有人可以帮助我吗?预先感谢

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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