在pandas文档cookbook的if-then部分下,我们可以根据使用 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.CCC
与下一行的 df.CCC
之间的差异大于或等于50时分配 df.BBB=5
那么我想创建一个给出以下数据框的条件:
# 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
我怎样才能得到这个结果?
Edit 我希望找到的答案是这样的
mask = df['CCC'].current - df['CCC'].next >= 50
df.loc[mask, 'BBB'] = 5
因为我对如何访问数据框中正在考虑的当前行之上或之下的值的一般问题感兴趣 . (不一定解决这个玩具示例 . )
diff()
将在我最初描述的例子中工作,但是在其他情况下,比如,我们想要比较两个元素而不是减去它们的情况呢?
如果我采用前一个数据帧并且我想查找当前列条目与 df.BBB
中的下一个不匹配的所有行然后根据这些比较分配_37838,该怎么办?
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[]
?
1 回答
特定
你可以先通过计算一个布尔掩码
然后发出
更一般地说,您可以计算班次
......然后做你想做的事,比如:
虽然对于你问题中的具体问题,
diff
方法已经足够了 .