Заменить значения в столбце по условию
Есть две колонки Count и Сondition. Хочу заменять значения в Сondition с условием.
В Сondition есть значения и 0. Если Count > Сondition - заменяем 0 ниже на значение, которое было до этого, если оно не 0. Count < Сondition - останавливаемся заменять 0 на значение. Второе условие - если Count < Сondition не достигнуто, но мы сталкиваемся с другим значением - останавливаем замену по этому значению и следовательно начинаем с другого.
Сделал через df.loc[(df['Сondition'].shift(1) !=0 ) & (df['Count'] > df['Сondition']), 'Сondition'] = df['Сondition'].shift(1), но это работает только построчно, не за раз.
Более полные данные.
Вот пример, что есть:
Count Сondition
1 27.39 0
2 27.32 0
3 27.33 0
4 27.32 0
5 27.35 0
6 27.35 0
7 27.3 27.16
8 27.24 0
9 27.22 0
10 27.21 0
11 27.17 0
12 27.19 27.15
13 27.21 0
14 27.18 0
15 27.16 0
16 27.17 0
17 27.17 0
18 27.17 0
19 27.18 0
20 27.11 0
21 27.11 0
22 27.11 0
23 27.11 0
24 27.09 0
25 27.12 0
26 27.15 0
27 27.11 27.05
28 27.12 0
И как должно получится:
Count Сondition
27.39 0
27.32 0
27.33 0
27.32 0
27.35 0
27.35 0
27.3 27.16
27.24 27.16
27.22 27.16
27.21 27.16
27.17 27.16
27.19 27.15
27.21 27.15
27.18 27.15
27.16 27.15
27.17 27.15
27.17 27.15
27.17 27.15
27.18 27.15
27.11 0
27.11 0
27.11 0
27.11 0
27.09 0
27.12 0
27.15 0
27.11 27.05
27.12 27.05
Ответы (1 шт):
Попробуйте так:
count, cond = df["Count"], df["Сondition"]
mask = ~((cond.replace(0, np.nan).ffill() >= count) & cond.eq(0))
df.loc[mask, "Сondition"] = df.loc[mask, "Сondition"].replace(0, np.nan)
df["Сondition"] = df["Сondition"].ffill().fillna(0)
результат:
In [31]: df
Out[31]:
Count Сondition
1 27.39 0.00
2 27.32 0.00
3 27.33 0.00
4 27.32 0.00
5 27.35 0.00
6 27.35 0.00
7 27.30 27.16
8 27.24 27.16
9 27.22 27.16
10 27.21 27.16
11 27.17 27.16
12 27.19 27.15
13 27.21 27.15
14 27.18 27.15
15 27.16 27.15
16 27.17 27.15
17 27.17 27.15
18 27.17 27.15
19 27.18 27.15
20 27.11 0.00
21 27.11 0.00
22 27.11 0.00
23 27.11 0.00
24 27.09 0.00
25 27.12 0.00
26 27.15 0.00
27 27.11 27.05
28 27.12 27.05