Вы можете сравнить name1
с ними name2
, затем сгруппировать по name1
и sum
Trues :
df['new'] = df.name2.eq(df.name1).astype(int).groupby(df.name1).transform('sum')
df
# name1 name2 new
#0 A B 2
#1 A A 2
#2 A C 2
#3 A A 2
#4 B B 1
#5 B A 1
Или, если использовать apply
, агрегировать подсчеты сначала, а затем использовать map
для генерации new
столбца:
cnt = df.groupby('name1').apply(lambda g: (g.name1 == g.name2).sum())
df['new'] = df.name1.map(cnt)
Сроки :
df = pd.concat([df]*10000)
%timeit df['new'] = df.name2.eq(df.name1).astype(int).groupby(df.name1).transform('sum')
# 100 loops, best of 3: 4.85 ms per loop
%%timeit
cnt = df.groupby('name1').apply(lambda g: (g.name1 == g.name2).sum())
df['new'] = df.name1.map(cnt)
# 10 loops, best of 3: 22.1 ms per loop