Как заменить текущее значение ячейки значением, которое является максимальным для текущей и предыдущей ячейки в столбце в фрейме данных pandas в Python

#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 репутаций, чтобы голосовать. Но обратная связь записывается.