У меня есть два кадра данных:
source_df
(source_df.shape == (1008, 27797)
):
|id |field_1| pubs | users |...|user_1 |user_2 |user_3 |...|user_27769 |
|-----|-------|--------|-------|...|----------|----------|----------|...|--------------|
| 1 |-------|[7, 10] |[1,2,3]|...| x_1_1 | x_2_1 | x_3_1 |...| x_27769_1 |
| 2 |-------|[13, 15]|[2,10] |...| x_1_2 | x_2_2 | x_3_2 |...| x_27769_2 |
|.. |.......|........|[1,2,9]|...|..........|..........|..........|...|..............|
| 1008|-------|[1,2,13]|[7,8,9]|...| x_1_1008 | x_2_1008 | x_3_1008 |...| x_27769_1008 |
user_pub_df
(user_pub_df.shape = (21, 27769)
):
|id| user_1 | user_2 | user_3 |...| user_27769 |
|--|--------|--------|--------|...|------------|
| 1| 10 | 0 | 7 |...| 0 |
| 2| 0 | 0 | 0 |...| 1 |
| 3| 0 | 8 | 4 |...| 0 |
|..| . | . | . |...| . |
| 7| 13 | 1 | 6 |...| 0 |
|10| 1 | 1 | 0 |...| 0 |
|13| 1 | 1 | 0 |...| 0 |
|15| 1 | 1 | 0 |...| 19 |
Id
вот id из столбца pubs
из source_df
.
Задача - заполнить source_df
значениями из user_pub_df
:
source_df.loc[1, 'user_1'] = user_pub_df.loc[7, 'user_1'] + user_pub_df.loc[10, 'user_1'] # 11
source_df.loc[1, 'user_2'] = user_pub_df.loc[7, 'user_2'] + user_pub_df.loc[10, 'user_2'] # 2
source_df.loc[1, 'user_3'] = user_pub_df.loc[7, 'user_3'] + user_pub_df.loc[10, 'user_3'] # 6
source_df.loc[2, 'user_2'] = user_pub_df.loc[13, 'user_2'] + user_pub_df.loc[15, 'user_2'] # 2
source_df.loc[2, 'user_10'] = user_pub_df.loc[13, 'user_10'] + user_pub_df.loc[15, 'user_10'] # 0
# and so on
Я сделал это с l oop:
for index, row in source_df.iterrows():
for user_id in row['users']:
source_df.loc[index, 'user_{}'.format(user_id)] = user_pub_df.loc[row['pubs'], user_id].sum()
Наивный код работает слишком медленно для 27769 пользователей и 21 паба (~ 16 минут).
Я пытался изменить .loc
на .at
то же самое результат.
PS: source_df
можно изменить, поэтому я не могу просто сохранить все комбинации user
/ pubs
в словаре / хэш-карте с ключом user+pubs
и предварительно вычисленным значением.