Найти минимум и максимумы из столбца df

Есть df (ссылка на файл)

df = pd.read_csv('23.csv')
df.columns = ['Date', 'for_max', 'for_min']

Хочу получить столбцы max/min в которых будут выделены максимумы и минимумы из небольших интервалов значений от 0 до 0 Например есть 0, 29,28,21,28,31,0 - интервал от 0 до 0. Здесь минимум 21 к примеру. Точно также для максимального.

Date    for_max for_min

1-Mar-00    0       0
2-Mar-00    29.47   0
3-Mar-00    29.28   0
6-Mar-00    29.69   0
7-Mar-00    31.95   0
8-Mar-00    0       0
4-Dec-00    0       0
5-Dec-00    0       0  
6-Dec-00    0       0
7-Dec-00    0   27.2
8-Dec-00    0   26.13
20-Dec-00   0   22.9
21-Dec-00   0   23.4
22-Dec-00   0   23.51
27-Dec-00   0   23.94
28-Dec-00   0   23.63
29-Dec-00   0      0
2-Jan-01    0      0
3-Jan-01    0      0

Итог

Date    for_max for_min  max   min   

1-Mar-00    0   0         0     0     
2-Mar-00    29.47   0     0     0     
3-Mar-00    29.28   0     0     0     
6-Mar-00    29.69   0     0     0     
7-Mar-00    31.95   0    31.95  0     
8-Mar-00    0   0         0     0     
5-Dec-00    0   0         0     0     
6-Dec-00    0   0         0     0     
7-Dec-00    0   27.2      0     0     
8-Dec-00    0   26.13     0     0     
20-Dec-00   0   22.9      0    22.9    
21-Dec-00   0   23.4      0     0    
22-Dec-00   0   23.51     0     0     
27-Dec-00   0   23.94     0     0     
28-Dec-00   0   23.63     0     0     
29-Dec-00   0   0         0     0     
2-Jan-01    0   0         0     0    
3-Jan-01    0   0         0     0

Ответы (1 шт):

Автор решения: strawdog

Можно попробовать сделать так:

df = pd.read_csv("23.csv")
df.fillna(0, inplace=True) # - у вас в исходных данных есть NaN, от которых мы избавляемся

df["max"] = df["for_max"].iloc[df[df["for_max"] != 0].
                               groupby((df["for_max"] == 0).cumsum())["for_max"].idxmax()]
df["min"] = df["for_min"].iloc[df[df["for_min"] != 0].
                               groupby((df["for_min"] == 0).cumsum())["for_min"].idxmin()]
df.fillna(0, inplace=True)

Ну и в результате:

       Date  for_max  for_min    max  min
0  1-Mar-00     0.00      0.0   0.00  0.0
1  2-Mar-00    29.47      0.0   0.00  0.0
2  3-Mar-00    29.28      0.0   0.00  0.0
3  6-Mar-00    29.69      0.0   0.00  0.0
4  7-Mar-00    31.95      0.0  31.95  0.0
5  8-Mar-00     0.00      0.0   0.00  0.0
6  4-Dec-00     0.00      0.0   0.00  0.0
7  5-Dec-00     0.00      0.0   0.00  0.0
8  6-Dec-00     0.00      0.0   0.00  0.0
9  7-Dec-00     0.00     27.2   0.00  0.0
...
100  15-Sep-06      0.0    62.21  0.0   0.00
101  18-Sep-06      0.0    63.00  0.0   0.00
102  19-Sep-06      0.0    61.87  0.0   0.00
103  20-Sep-06      0.0    60.30  0.0   0.00
104  21-Sep-06      0.0    60.34  0.0   0.00
105  22-Sep-06      0.0    60.11  0.0   0.00
106  25-Sep-06      0.0    59.32  0.0  59.32
107  26-Sep-06      0.0    59.70  0.0   0.00
108  27-Sep-06      0.0     0.00  0.0   0.00
109  28-Sep-06      0.0     0.00  0.0   0.00
→ Ссылка