Я пытался найти решение, используя векторы, но не смог.Это решение выполняет итерацию по индексу и вычисляет новые значения для New1 и New2.
Это достигнет результата, который, я полагаю, вы ищете.
for i in df.index:
# Grab the category variable for each row.
cat = df.loc[i,'Cat']
# Set column New1
mask1 = df['Cat'] == cat
mask2 = df.index != i
df.at[i,'New1']= df[mask1 & mask2]["ID"].sample().iloc[0]
# Set column New2
mask3 = df['Cat'] != cat
df.at[i,'New2']= df[mask3]["ID"].sample().iloc[0]
print (df) 1-й:
ID Cat New1 New2
0 87 A 56.0 76.0
1 56 A 87.0 36.0
2 67 A 56.0 76.0
3 76 D 36.0 87.0
4 36 D 76.0 87.0
print (df) 2-й:
ID Cat New1 New2
0 87 A 67.0 36.0
1 56 A 87.0 36.0
2 67 A 87.0 76.0
3 76 D 36.0 67.0
4 36 D 76.0 67.0
Из этих результатов вы можете видеть, что вы получаетеслучайные результаты при использовании sample ().