В разделе if-then документации pandas поваренная книга мы можем присвоить значения в одном столбце на основе условия, выполняемого для отдельного столбца, с помощью loc[]
.
df = pd.DataFrame({'AAA' : [4,5,6,7],
'BBB' : [10,20,30,40],
'CCC' : [100,50,-30,-50]})
# AAA BBB CCC
# 0 4 10 100
# 1 5 20 50
# 2 6 30 -30
# 3 7 40 -50
df.loc[df.AAA >= 5,'BBB'] = -1
# AAA BBB CCC
# 0 4 10 100
# 1 5 -1 50
# 2 6 -1 -30
# 3 7 -1 -50
Но что, если я хочу написать условие, которое включает в себя предыдущую или последующую строку, используя .loc[]
?Например, я хочу назначить df.BBB=5
везде, где разница между df.CCC
текущей строки и df.CCC
следующей строки больше или равна 50. Затем я хотел бы создать условие, которое даетмне следующий фрейм данных:
# AAA BBB CCC
# 0 4 5 100 <-| 100 - 50 = 50, assign df.BBB = 5
# 1 5 5 50 <-| 50 -(-30)= 80, assign df.BBB = 5
# 2 6 -1 -30 <-| 30 -(-50)= 20, don't assign df.BBB = 5
# 3 7 -1 -50 <-| (-50) -0 =-50, don't assign df.BBB = 5
Как я могу получить этот результат?
Редактировать Ответ, который я надеюсь найти, что-то вроде
mask = df['CCC'].current - df['CCC'].next >= 50
df.loc[mask, 'BBB'] = 5
, потому что меня интересует общая проблема, связанная с тем, как я могу получить доступ к значениям выше или ниже текущей строки, рассматриваемой в кадре данных (необязательно для решения этого одного игрушечного примера.)
diff()
будет работать на примере, который я только что описал, но в каком другом случае, скажем, мы хотим сравнить два элемента, а не вычесть их?
Что если я возьму предыдущий фрейм данных и хочу найти всестроки, в которых текущая запись столбца не соответствует следующей в df.BBB
, а затем присваивается df.CCC
на основе этих сравнений?
if df.BBB.current == df.CCC.next:
df.CCC = 1
# AAA BBB CCC
# 0 4 5 1 <-| 5 == 5, assign df.CCC = 1
# 1 5 5 50 <-| 5 != -1, do nothing
# 2 6 -1 1 <-| -1 == -1, assign df.CCC = 1
# 3 7 -1 -50 <-| -1 != 0, do nothing
Есть ли способ сделать это с пандами, используя .loc[]
?