Создайте третий фрейм данных, который считает общие значения с первыми двумя - PullRequest
0 голосов
/ 07 мая 2020

Я изо всех сил пытаюсь придумать, с чего начать, поэтому извиняюсь за отсутствие кода для ссылки.

У меня два фрейма данных. Назовем его

df1 = повара

enter image description here

df2 = Рецепты

enter image description here

Каждый шеф-повар может создавать рецепты, которые равны или менее сложны, чем их уровень навыков. Таким образом, шеф-повар A может делать только легкие и средние рецепты, а шеф-повар E может готовить все рецепты.

Моя цель - создать что-то вроде ниже, которое суммирует количество ингредиентов, которые есть у шеф-повара для каждого рецепта, который он или она может приготовить. чтобы получить результат, как показано ниже. Для справки о масштабе / эффективности в моем реальном наборе данных около 100i sh поваров и около 2000 рецептов (что сюрприз не для поваров и рецептов, но пока подыгрывает ...). Ниже приведены все рецепты, которые каждый шеф-повар мог приготовить с умом. В идеале я бы не показывал рецепты с 0 совпадениями ингредиентов. enter image description here

Спасибо за любую помощь! Я понятия не имею, с чего начать с merge () или isin (). Я новичок в Python, но я определенно могу читать и понимать код, поэтому не чувствую необходимости слишком долго держать руку на своем коде !!

1 Ответ

2 голосов
/ 08 мая 2020

Это кажется относительно неэффективным, если перебирать поваров и рецепты, чтобы получить пересечение ингредиентов поваров и ингредиентов рецепта (отфильтрованных, соответствующих уровню навыков), но это работает.

# create ordinal mapping for ease of comparison
ordinals = {'Easy': 0,
            'Medium': 1,
            'Hard': 2}

chefs['Ordinal_Difficulty'] = chefs['Difficulty'].map(ordinals)
recipes['Ordinal_Difficulty'] = recipes['Difficulty'].map(ordinals)

# create dictionary of chefs with their ingredients
chef_ingredients = {values[0]: list(values[2:-1]) for values in chefs.values}

# create dictionary of chefs with their skill levels
chef_skill = pd.Series(chefs['Ordinal_Difficulty'].values,index=chefs['Chef_ID']).to_dict()

# to be list of lists of chef_ID, recipe_ID, and common ingredient count
final_list = []

# loop through each chef (relatively inefficient)
for chef, ingredients in chef_ingredients.items():
    skill_level = chef_skill[chef] # grab their skill level to filter by
    # create dictionary of skill-appropriate recipes with their ingredients
    cookable_recipes = {values[0]: list(values[2:-1]) for values in recipes.values if values[-1] <= skill_level}
    # list comprehension containing chef ID, recipe ID, and number of common ingredients in each cookable recipe
    chefs_ingredients_per_cookable_recipe = [(chef, key, len(set(ingredients) & set(value))) for key, value in cookable_recipes.items()]
    # add to 'final_list' -- extending to flatten out lists
    final_list.extend(chefs_ingredients_per_cookable_recipe)

# convert final_list to DataFrame
match = pd.DataFrame(final_list, columns = ['Chef_ID', 'Recipe', 'Count'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...