Частота корреляции между двумя категориальными столбцами Pandas

У меня есть два фрейма данных pandas, причем каждый уникальный member_id потенциально может иметь множество строк, в которых перечислены принадлежащие им автомобили и домашние животные соответственно. Каждый из двух DF имеет тысячи строк, и их структуры выглядят следующим образом (это суперабстрактный пример, потому что я не вправе указывать, какие категориальные переменные я на самом деле сравниваю. Суть в том, что есть две категориальные переменные, которые у каждого члена может быть несколько, и известно, что существует вероятная корреляция по крайней мере между некоторыми парами автомобилей/домашних животных): Автомобили и домашние животные

Моя цель — изучить попарную корреляцию между каждой парой питомца и автомобиля. Например, на изображении, прикрепленном выше, из трех участников, у которых есть кошка (2, 3 и 4), у одного есть Toyota. Таким образом, попарная частота для Cat-Toyota составит 33%. Это довольно легко сделать с небольшим набором данных, но мне очень трудно понять, как автоматизировать это для тысяч строк. В частности, поскольку каждый участник может иметь множество строк в обоих фреймах данных, я не могу понять, как группировать по членам, а затем перебирать каждую комбинацию питомца и автомобиля для этого члена.

Если я плохо объяснил это или отформатировал свой пост, пожалуйста, простите меня. Я давний соглядатай, впервые постер :). Любая помощь приветствуется; не стесняйтесь задавать вопросы, если я не достаточно уточнил! Спасибо


person Eddie McGolrick    schedule 27.07.2020    source источник
comment
Пожалуйста, не обновляйте изображения как код. Вставка в виде текста увеличивает ваши шансы получить ответ. Не стесняйтесь читать как спросить   -  person Terry    schedule 27.07.2020
comment
@Terry Как загрузить DF в виде текста? Мне еще предстоит понять это, и эта ссылка, похоже, не имеет ответа   -  person Eddie McGolrick    schedule 07.08.2020
comment
вы можете скопировать результат df.head() в качестве примера и вставить в качестве примера кода в меню редактирования   -  person Terry    schedule 07.08.2020


Ответы (1)


Прежде всего создали некоторые случайные данные (хороший момент для следующего раза, когда легко скопировать образец данных):

from random import choices
import pandas as pd

member_ids = [1,2,3,4]
pets = ['cat', 'dog', 'snake', 'lion', 'platypus', 'bat', 'pangolin']
cars = ['toyota', 'ford', 'fiat', 'maserati', 'ferrari']

df = pd.DataFrame([choices(member_ids, k=200), choices(pets, k=200), choices(cars, k=200)], index=['id', 'pet', 'car']).T.drop_duplicates()

Затем, если я правильно понимаю, что вы хотите, используйте нормализованное число групп и значений:

df.groupby('pet')['car'].value_counts(normalize=True).round(3)
person Ezer K    schedule 27.07.2020
comment
Спасибо за участие и совет! - person Eddie McGolrick; 28.07.2020