У меня есть вопрос по обработке данных, и я надеюсь, что кто-то может помочь.
У меня есть два столбца в фрейме данных:
A B
111 5.2
EF 5.6
DG 5.1
LK 5.4
111 5
EF 5.2
Я хочу сделать 3-й столбец C, где каждый раз, когда 111 отображается в столбце a, я хочу убрать разницу с 5 из столбца B, пока не будет показано следующее 111.
Так это будет выглядеть так
A B C
111 5.2 5 (minus 0.2)
EF 5.6 5.4 (minus 0.2)
DG 5.1 4.9 (minus 0.2
LK 5.4 5.2 (minus 0.2)
111 5 5 (no change needed as already 5)
EF 5.2 5.2 (no change needed as previous 111 already 5)
Таким образом, если 111 в столбце A имеет значение в столбце B, равное 5,2, то (5-5,2=-0,2) Следовательно, C=5,2 + -0,2 = 5. Если 111 в столбце A имеет значение в столбце B, равное 4,8, то (5-4,8=0,2) Следовательно, C=4,8+0,2 = 5. И так до тех пор, пока не будет найден следующий 111.
Надеюсь, это имеет смысл. По сути, 111 - это стандарт, который должен быть равен 5. Если это не 5, я хочу применить разницу ко всем значениям в строке B, пока не будет найден новый 111. Любые предложения по этому поводу?
Точно. Каждый раз, когда обнаруживается новый 111, выполняется расчет, чтобы увидеть, насколько он далек от 5, затем это используется для внесения изменений в остальные строки, пока не будет найден новый 111. Затем это должно повториться.






вы должны просто уметь использовать np.where и ffill
df['C'] = np.where(df['A'] == '111', 5 - df['B'], np.nan)
df['C'] = df['C'].ffill()
df['C'] = df['B'] - abs(df['C'])
A B C
0 111 5.2 5.0
1 EF 5.6 5.4
2 DG 5.1 4.9
3 LK 5.4 5.2
4 111 5.0 5.0
5 EF 5.2 5.2
Проверьте свой вывод
Это сработало отлично! Спасибо большое. Я изучил новую функцию .ffil (форвардная заливка) действительно полезная!
Я использую transform после создания группового ключа с cumsum
df['C']=df.B-(df.groupby(df.A.eq('111').cumsum()).B.transform('first')-5)
df
Out[662]:
A B C
0 111 5.2 5.0
1 EF 5.6 5.4
2 DG 5.1 4.9
3 LK 5.4 5.2
4 111 5.0 5.0
5 EF 5.2 5.2
Спасибо за ваш ответ! Это выглядит как очень сложный метод, я буду читать о различных функциях, которые вы использовали.
И должно ли то же самое относиться к следующим 111 найденным?