Булевский DataFrame из серии с самим собой в Pandas

1

У меня есть 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         |

Что было бы самым эффективным способом сделать это в Пандах? Я не мог понять, есть ли быстрый способ сделать это, поскольку во всех примерах документации, которые я смог найти, логические маски используют имена категорий в качестве заголовков столбцов (а не сами элементы как столбцы и строки).

Теги:
pandas
dataframe

1 ответ

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
  • 1
    Спасибо, я был уверен, что есть способ использовать некоторую комбинацию методов изменения формы, но я не мог найти правильный. Это прекрасно работает :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню