Если вас интересует только столбец CrossCategory
, вы можете использовать:
df.groupby('Customer')['Category'].nunique() > 1
, что дает
Customer
boo False
foo True
zoo False
Name: Category, dtype: bool
Для части pivot
:
Вы можете добавить еще один столбец:
df['visited'] = 'Y'
и затем использовать pivot
p = df.pivot(index='Customer', columns='Category', values='visited').fillna('N')
Category A B C
Customer
boo Y N N
foo Y Y N
zoo N N Y
Затем мы используем второй подход, чтобы получить столбец CrossCategory
# alternative approach to the nunique part from above
df['CrossCategory'] = df.groupby('Customer')['Category'].transform('size') > 1
Customer Category visited CrossCategory
0 foo A Y True
1 foo B Y True
2 boo A Y False
3 zoo C Y False
и, наконец, объединить два кадра данных
pd.concat([p, df[['Customer', 'CrossCategory']].drop_duplicates().set_index('Customer')], sort=False, axis=1)
Это дает:
A B C CrossCategory
boo Y N N False
foo Y Y N True
zoo N N Y False
Я почти уверен, что есть более элегантные решения, но это дает желаемый результат.
Если у вас большие наборы данных, вы можете запустить groupby
с sort=False
.