Как я могу выполнить добавление в столбце на основе условия, которое изменяется для каждой строки?

У меня есть вопрос по обработке данных, и я надеюсь, что кто-то может помочь.

У меня есть два столбца в фрейме данных:

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 найденным?

yatu 29.04.2019 15:34

Точно. Каждый раз, когда обнаруживается новый 111, выполняется расчет, чтобы увидеть, насколько он далек от 5, затем это используется для внесения изменений в остальные строки, пока не будет найден новый 111. Затем это должно повториться.

FellowLuke 29.04.2019 15:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
45
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

вы должны просто уметь использовать 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

Проверьте свой вывод

BENY 29.04.2019 15:47

Это сработало отлично! Спасибо большое. Я изучил новую функцию .ffil (форвардная заливка) действительно полезная!

FellowLuke 29.04.2019 16:00

Я использую 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

Спасибо за ваш ответ! Это выглядит как очень сложный метод, я буду читать о различных функциях, которые вы использовали.

FellowLuke 29.04.2019 16:03

Другие вопросы по теме