Ускорение цикла с указателем на словарь - PullRequest
0 голосов
/ 04 июля 2019

Следующий цикл for работает, но это занимает много времени. Датафрейм df_customers имеет около 1,5 миллиона записей, а dict_customers - около 500 000 строк.

for i in range(len(df_customers)):
    df_customers.iloc[i, j] = dict_customers[df_customers.iloc[i,k]]

Мой вопрос: как ускорить цикл for?

Dataframe df_customers содержит функции клиента, о. Пользовательский ИД. Один клиент имеет несколько строк (поэтому не уникален для каждой строки).

Словарь dict_customers содержит уникальные идентификаторы клиентов (ключи) и количество посещений на клиента (значения).

Я хотел бы добавить новый столбец k в Dataframe df_customers, который содержит количество посещений, извлеченных из словаря.

Я решил эту проблему с помощью цикла for с помощью df_customers: я строки j - новая колонка с посещениями k - существующий столбец с идентификаторами клиентов

Примечание: идентификатор клиента начинается с 100 000.

Я попробовал следующее понимание:

df_customers.j-column = [dict_customers[df_custumers.k-column[i]] for i in range(len(df_customers))]

Письменный код понимания не работает. Сохраняет все значения 0 (как инициализировано) Ожидаемый результат заключается в том, что для каждого CustomerID посещения клиентов из словаря сохраняются в новом столбце df_customers k.

1 Ответ

0 голосов
/ 06 июля 2019

Я нашел решение:

  1. Создать список значений словаря (идентификаторы клиентов: последовательный):
    list_values = [v for v in dict_customers.values()]

  2. Создать массив из этого списка (также для ускорения):
    array_values = np.array(list_values

  3. Понимание возвращает значения массива, указанного столбец df_customers j (и исправлен, так как CustomerID начинается с 100 000 и индекс массива в 0):
    df_customers['j-column'] = array_values[df_customers.iloc[i,k] - 100000] for i in range(len(df_customers))]

...