#python #pandas
Вопрос:
У меня большой фрейм данных, и я хочу запустить следующий код (который является правильным) намного быстрее, чтобы сократить время обработки. Логика: Я хочу отсортировать значения в каждом столбце в возрастающем (кумулятивном) порядке, но когда встречается «нулевая строка» (например, 5-я строка), эту строку следует пропустить (код: если строка 2 == 0: продолжить). Если значение 2-й ячейки (строка 2) меньше предыдущего (строка 1), то значение 2-й ячейки заменяется первым. Я хочу, чтобы этот код работал быстрее. Если используется приведенный ниже код, то итерация по df, имеющему форму (1305 столбцов, 3000 строк), занимает около 1,5 минут для завершения. Нужна помощь в этом отношении, чтобы сократить время обработки.
import pandas as pd df = pd.DataFrame({ 'A1': [118.0, 189.0, 154.0, 129.0, 0, 227.0, 208.0, 200.0, 733.0, 804.0, 861.0], 'A2': [108.0, 54.0, 122.0, 148.0, 0, 0, 0, 0, 838.0, 996.0, 987.0], 'A3': [70.0, 89.0, 107.0, 148.0, 0, 149.0, 241.0, 222.0, 825.0, 954.0, 1138.0], 'A4': [80.0, 40, 117.0, 158.0, 0, 0, 0, 0, 700, 899, 850] }) for i in df.columns: for j in range(len(df) - 1): row1 = df[i][j] row2 = df[i][j 1] # print(row1, row2) if row2 == 0: continue elif row2 - row1 lt; 0: # print('true') df[i][j 1] = df[i][j]
Ответ №1:
IIUC, тогда это решит вашу проблему
def transform_col(series): return series.groupby(series.eq(0).cumsum()).cummax() df.apply(transform_col)
Результат
A1 A2 A3 A4 0 118.0 108.0 70.0 80.0 1 189.0 108.0 89.0 80.0 2 189.0 122.0 107.0 117.0 3 189.0 148.0 148.0 158.0 4 0.0 0.0 0.0 0.0 5 227.0 0.0 149.0 0.0 6 227.0 0.0 241.0 0.0 7 227.0 0.0 241.0 0.0 8 733.0 838.0 825.0 700.0 9 804.0 996.0 954.0 899.0 10 861.0 996.0 1138.0 899.0
Комментарии:
1. Идеальный. Этот код в 100 раз быстрее моего кода. Большое спасибо за код. Это сэкономило мне много времени.
2. Пожалуйста, сделайте мне одолжение и примите ответ. Ваше здоровье.
3. Я принял это. Но у меня нет 15 репутаций, чтобы голосовать. Но обратная связь записывается.