Я думаю, что нужно transform
с numpy.where
:
df['id'] = np.where(df.groupby(['a', 'b', 'c'])['a'].transform('size') > 1, -1, 2)
print (df)
a b c d id
0 10 2017 20.0 231 -1
1 10 2017 20.0 223 -1
2 20 2018 10.0 113 2
3 30 2017 11.0 134 -1
4 30 2017 11.0 112 -1
5 30 2017 11.0 111 -1
Если хотите значения 1
и 0
, другое решение - привести логическую маску к integer
s:
df['id'] = np.where(df.groupby(['a', 'b', 'c'])['a'].transform('size') > 1, 1, 0)
df['id'] = (df.groupby(['a', 'b', 'c'])['a'].transform('size') > 1).astype(int)
print (df)
a b c d id
0 10 2017 20.0 231 1
1 10 2017 20.0 223 1
2 20 2018 10.0 113 0
3 30 2017 11.0 134 1
4 30 2017 11.0 112 1
5 30 2017 11.0 111 1
РЕДАКТИРОВАТЬ Я думаю, что нужно GroupBy.ngroup
:
#create values by size of columns
df['id'] = df.groupby(['a', 'b', 'c'])['a'] .transform('size')
#filter out rows
df = df[df['id'] > 1]
#sequencial id values
df['id'] = df.groupby(['a', 'b', 'c'])['a'].ngroup() + 1
a b c d id
0 10 2017 20.0 231 1
1 10 2017 20.0 223 1
3 30 2017 11.0 134 2
4 30 2017 11.0 112 2
5 30 2017 11.0 111 2