Код занимает слишком много времени для нормализации и применения функции в Pandas

1

это всего лишь образец данных с моим кодом. Я хочу нормализовать общий столбец в другом столбце. в настоящее время у меня есть около 2000 групп, для этого требуется 15 минут для нормализации и fgroup.

каковы способы сокращения времени.

import pandas as pd
import numpy as np

np.random.seed(1234)
n = 1500000

df = pd.DataFrame()
df['group'] = np.random.randint(1700, size=n)
df['ID'] = np.random.randint(5, size=n)
df['Total'] = np.random.randint(400, size=n)
df['Normalized_total'] = df.groupby('group')['Total'].apply(lambda x: (x-x.min())/(x.max()- x.min()))

def norm_group(df):
    if df['Normalized_total'] > 0.70 and df['group'] > 100 and df['ID'] > 3:
        return 3
    elif df['Normalized_total'] > 0.5 and df['group'] < 100 and df['ID'] < 3:
        return 2
    else:
        return 1

df['fgroup'] = df.apply(norm_group, axis=1)

Спасибо

  • 1
    Это не должно занять 15 минут, даже с 2000 группами. Как долго ваш фактический фрейм данных (я имею в виду количество строк)? Если я проворачиваю до 15 М и оставляю ngroups = 1700, это все равно займет у меня всего 6 секунд (что, я признаю, не так быстро, но далеко от 15 минут).
  • 0
    в моем исходном наборе данных у меня 2000 групп. форма данных кадра (1200000, 40). Я не знаю, почему это занимает слишком много времени для этого куска кода.
Показать ещё 4 комментария
Теги:
pandas
python-3.x

1 ответ

1

Вы можете использовать transform и определить свою собственную функцию

%timeit df['Normalized_total'] = df.groupby('group')['Total'].apply(lambda x: (x-x.min())/(x.max()- x.min()))
1 loop, best of 3: 508 ms per loop

# below is my solution
def myfunc():
    g=df.groupby('group')['Total']
    return df['Total']-g.transform('min')/g.transform(np.ptp)
%timeit myfunc()
1 loop, best of 3: 398 ms per loop
  • 0
    я отредактировал свой вопрос, пожалуйста, посмотрите на него.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню