Обобщить результаты DataFrame: группировка по группе ряда чисел заканчивающейся нулем
Есть ряд данных. В конце каждого ряда нужно указать "первое значение ряда", "последнее значение" и "экстремум - максимум" или минимум из ряда (в данном примере максимум). Строки с 0 нужно сохранить. Записывается в конце ряда так:
0
0
24.61
24.82
24.85
24.9
24.98
24.93
24.9
24.89 24.61 24.89 24.98
0
0
Если сделать такой код, то почему то слетает last и индекс конечно не сохранится, все слетает:
df = pd.read_csv('D:\\Desktop\\111.csv', header=None, names=['COUNT'])
df['first'] = 0
df['last'] = 0
df['max'] = 0
df['temp'] = ((df['COUNT'] > 0) & (df['COUNT'].shift(1) == 0))
df['group'] = df['temp'].cumsum()
df1 = df.copy()
df1 = df.groupby('group').agg({"COUNT":['first', 'last', 'max']})
df1.columns = df1.columns.droplevel(1)
df1.columns = ['first', 'last', 'max']
df1
Пример файла данных и что хочу получить.
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Попробуйте так:
from itertools import product
def first(s):
return s.loc[(s!=0).idxmax()]
df = pd.read_excel(filename)
col = '<COUNT>'
mask = (df[col].ne(0) & df[col].shift(-1).eq(0))
tmp = df.groupby(mask.shift().fillna(0).cumsum())[col].agg([first, "last", "max"])
new_cols = ["<first>", "<last>", "<max>"]
df = df.assign(**dict(product(new_cols, [""])))
df.loc[mask, new_cols] = tmp.iloc[:mask.sum()].values
df.to_excel("/path/to/result.xlsx", index=False)
Результат:
In [124]: df
Out[124]:
<COUNT> <first> <last> <max>
0 0.00
1 0.00
2 0.00
3 0.00
4 24.61
5 24.67
6 24.80
7 24.84
8 24.79
9 24.82
10 24.79
11 24.82
12 24.85
13 24.90
14 24.98
15 24.93
16 24.90
17 24.89 24.61 24.89 24.98
18 0.00
19 0.00
20 0.00
21 0.00
22 0.00
23 0.00
24 0.00
25 0.00
26 0.00
27 0.00
28 0.00
29 0.00
30 24.94
31 24.94
32 24.89 24.94 24.89 24.94
33 0.00
34 0.00
35 0.00
36 0.00
37 24.93
38 24.93
39 24.95 24.93 24.95 24.95
40 0.00
41 24.94 24.94 24.94 24.94
42 0.00
43 24.94
44 24.95
45 24.98
46 24.97
47 24.98 24.94 24.98 24.98
48 0.00
49 0.00
50 0.00
51 0.00
52 0.00
53 0.00
54 25.07
55 25.04
56 25.07
57 25.07
58 25.03 25.07 25.03 25.07
59 0.00
60 0.00
61 0.00
62 0.00
63 0.00
64 0.00
65 0.00
66 0.00
67 0.00
68 0.00