У меня есть Pandas DataFrame с информацией о категории, хранящейся в столбце, например (всего 2 категории, но много элементов):
| index | item | category |
|-------|-----------|----------|
| 0 | water | drink |
| 1 | pasta | food |
| 2 | burger | food |
| 3 | pepsi | drink |
| 4 | chocolate | food |
Я хочу создать маску DataFrame, но вместо использования имен категорий я хотел бы, чтобы каждый элемент был как строкой, так и столбцом. Записи будут 1 для предметов в той же категории, 0 в противном случае:
| item | water | pasta | burger | pepsi | chocolate |
|-----------|-------|-------|--------|-------|-----------|
| water | 1 | 0 | 0 | 1 | 0 |
| pasta | 0 | 1 | 1 | 0 | 1 |
| burger | 0 | 1 | 1 | 0 | 1 |
| pepsi | 1 | 0 | 0 | 1 | 0 |
| chocolate | 0 | 1 | 1 | 0 | 1 |
Что было бы самым эффективным способом сделать это в Пандах? Я не мог понять, есть ли быстрый способ сделать это, поскольку во всех примерах документации, которые я смог найти, логические маски используют имена категорий в качестве заголовков столбцов (а не сами элементы как столбцы и строки).
В моем комментарии я был некорректен, это потребовало некоторой предварительной обработки
Сначала merge
по категории:
df1 = df.merge(df, on='category')
pd.crosstab
pd.crosstab(df1.item_x, df1.item_y)
item_y burger chocolate pasta pepsi water
item_x
burger 1 1 1 0 0
chocolate 1 1 1 0 0
pasta 1 1 1 0 0
pepsi 0 0 0 1 1
water 0 0 0 1 1