Pandas groupby () сравнивает и подсчитывает два столбца

У меня есть следующий кадр данных Pandas:

name1   name2
A       B
A       A
A       C
A       A
B       B
B       A

Я хочу добавить столбец с именем, newкоторый подсчитывает по группам, name1как часто name1это то же самое name2.

Следовательно, ожидаемым результатом является следующий блок данных:

name1   name2   new
A       B       2       
A       A       2
A       C       2
A       A       2
B       B       1
B       A       1

Я пробовал следующее, но я получаю сообщение об ошибке:

df['new'] = df.groupby('name1').apply(lambda x: (x[x['name1'] == x['name2']].fillna(False).sum()))

TypeError: несовместимый индекс вставленного столбца с индексом кадра

python,pandas,compare,pandas-groupby,

2

Ответов: 1


4 принят

Вы можете сравнить 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
питон, панды, сравнить, панда-GroupBy,
Похожие вопросы
Яндекс.Метрика