Если пропущенные значения не являются проблемой, используйте GroupBy.transform
с unique
:
df['uniqueNo']=df.groupby(['id'])['valueNo'].transform('unique')
print (df)
id value1 valueNo uniqueNo
0 1 12 140.0 [140.0, 149.0]
1 1 13 149.0 [140.0, 149.0]
2 1 11 149.0 [140.0, 149.0]
3 2 11 NaN [nan, 150.0]
4 2 11 150.0 [nan, 150.0]
5 3 15 145.0 [145.0, 149.0]
6 3 12 149.0 [145.0, 149.0]
Если необходимо удалить их, сначала удалите их, объедините unique
и map
в новый столбец:
s = df.dropna(subset=['valueNo'])['valueNo'].astype(int).groupby(df['id']).unique()
#if converting to intgers is not necessary
#s = df.dropna(subset=['valueNo']).groupby('id')['valueNo'].unique()
df['uniqueNo'] = df['id'].map(s)
print (df)
id value1 valueNo uniqueNo
0 1 12 140.0 [140, 149]
1 1 13 149.0 [140, 149]
2 1 11 149.0 [140, 149]
3 2 11 NaN [150]
4 2 11 150.0 [150]
5 3 15 145.0 [145, 149]
6 3 12 149.0 [145, 149]