Вот мой вклад:панды заменить только часть колонки
import pandas as pd
import numpy as np
list1 = [10,79,6,38,4,557,12,220,46,22,45,22]
list2 = [4,3,23,6,234,47,312,2,426,42,435,23]
df = pd.DataFrame({'A' : list1, 'B' : list2}, columns = ['A', 'B'])
df['C'] = np.where (df['A'] > df['B'].shift(-2), 1, np.nan)
print (df)
, который производит этот выход:
A B C
0 10 4 NaN
1 79 3 1.0
2 6 23 NaN
3 38 6 NaN
4 4 234 NaN
5 557 47 1.0
6 12 312 NaN
7 220 2 1.0
8 46 426 NaN
9 22 42 NaN
10 45 435 NaN
11 22 23 NaN
Что мне нужно сделать, это изменить столбец «C», чтобы быть набор из трех 1 в ряд, неперекрывающихся. Требуемый выход:
A B C
0 10 4 NaN
1 79 3 1.0
2 6 23 1.0
3 38 6 1.0
4 4 234 NaN
5 557 47 1.0
6 12 312 1.0
7 220 2 1.0
8 46 426 NaN
9 22 42 NaN
10 45 435 NaN
11 22 23 NaN
Итак, строки 2, 3 и 6 изменяются от NaN до 1.0. Строка 7 уже имеет 1.0 и игнорируется. Строки 8 и 9 должны оставаться NaN, потому что строка 7 является последней записью предыдущего набора.
Я не знаю, есть ли лучший способ построить столбец «C», который будет делать это при создании.
Я пробовал несколько вариантов fillna и ffill, ни один из них не работал для меня.
Это кажется очень запутанным, но я попытался выделить идентификатор строки для каждого 1,0 с этой линией:
print (df.loc[df['C'] == 1])
Какие правильно выводит этот:
A B C
1 79 3 1.0
5 557 47 1.0
7 220 2 1.0
Даже если я знаю, что информация, я не знаю, как исходить оттуда.
Большое вам спасибо за вашу помощь заранее, Давида
Что делать, если у вас есть последовательность, как '1, NaN, 1,1, NaN, NaN'? что бы вы хотели, чтобы результат был? – Psidom
спасибо за просмотр psidom - результат будет все 1's –
OK. Так должен ли индекс 8 и 9 быть наном в вашем случае? – Psidom