У меня большая (~ 145000 строк) база данных рецептов, над которой я работаю. У меня есть столбец 'parsed_ingredients', который выглядит следующим образом (несколько диктов на строку):
[{'orig_name': '1,00 kg Kalbsbraten ',
'orig_amount': '1.00',
'orig_unit': 'kg',
'amount': 0.25,
'unit': 'g',
'splitted_ingredient': 'Kalbsbraten',
'splitted_slized_ingredient': 'Kalbsbraten',
'further_specification': '',
'alternatives': '',
'matched_ingredient_id': 'U030100',
'matched_ingredient_st': 'Kalb Hackfleisch roh',
'calorie': 148,
'protein': 19.726,
'carb': 0.0,
'fat': 7.713},
{'orig_name': '1,00 Zwiebel(n) ',
'orig_amount': '1.00',
'orig_unit': 'Anzahl',
'amount': 9.0,
'unit': 'g',
'splitted_ingredient': 'Zwiebel(n)',
...
]
По сути, я пытаюсь подготовить свой df для элемента и пользователя (на основе контента) Рекомендую систему, поэтому я пытаюсь создать матрицу со столбцом для каждого ингредиента, содержащегося в рецепте.
Я пробовал следующее, но у меня была проблема, что это просто очень медленно с таким большим количеством rows:
for index, row in df.iterrows():
extracted_ingredient = ""
for ingredient in row["parsed_ingredients"]:
extracted_ingredient = ingredient["matched_ingredient_st"]
if not extracted_ingredient == "None":
df.loc[index, extracted_ingredient] = 1
Поэтому я попытался написать функцию для использования с apply, так как я читал, что она вычисляется намного быстрее, но потом понял, что apply всегда хочет, чтобы я возвратил что-то для сохранения в DF (в противном случае я получаю 'TypeError: объект' NoneType 'не может быть вызван':
def ingredient_extraction(content, dataframe=df):
for newrow in content:
for entry in newrow:
if not entry["matched_ingredient_st"] == "None":
df[entry["matched_ingredient_st"]] = 1
df.apply(ingredient_extraction(df["parsed_ingredients"], df), axis=1)
Можно ли как-нибудь заставить pandas применить эту функцию к моему df независимо от этого? Или есть лучший способ ускорить операцию сделано в iterrows?