У меня есть DataFrame dask, как показано ниже.
> print(df_user_preferences)
user_id food_id
int64 int64 int64
...
Этот фрейм данных представляет отношение «многие ко многим» между user
и food
.Есть также два кадра данных, df_users
и df_foods
, и это основные данные о пользователях и продуктах питания.
А теперь я хочу получить фрейм данных, как показано ниже.
# index is user_id.
> print(df_spread_user_preferences)
food_1 food_2 food_3 food_4 ...
int64 boolean boolean boolean boolean ...
...
Эти столбцы с префиксом food_
оканчиваются на food_id
, а их значения представляют отношение между user
и food
.
Я пробовал код ниже, но это слишком медленно.Как я могу улучшить этот код для более эффективной работы?
df_spread_user_preferences = df_users.assign(**{
f"food_{food_id}": lambda df, food_id: df.apply(
lambda row, food_id: len(df_user_preferences[(
df_user_preferences.food_id == food_id
) & (
df_user_preferences.user_id == row.name
)]) > 0,
axis=1,
meta='boolean',
food_id=food_id
) for _, food_id in df_foods.index.to_series().iteritems()
}).drop(df_users.columns)