首页 文章

访问pandas .loc []赋值中的下一行,上一行或当前行

提问于
浏览
3

在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 回答

  • 1

    特定

    >>> df
       AAA  BBB  CCC
    0    4   10  100
    1    5   20   50
    2    6   30  -30
    3    7   40  -50
    

    你可以先通过计算一个布尔掩码

    >>> mask = df['CCC'].diff(-1) >= 50
    >>> mask
    0     True
    1     True
    2    False
    3    False
    Name: CCC, dtype: bool
    

    然后发出

    >>> df.loc[mask, 'BBB'] = 5
    >>> 
    >>> df
       AAA  BBB  CCC
    0    4    5  100
    1    5    5   50
    2    6   30  -30
    3    7   40  -50
    

    更一般地说,您可以计算班次

    >>> df['CCC_next'] = df['CCC'].shift(-1) # or df['CCC'].shift(-1).fillna(0)
    >>> df
       AAA  BBB  CCC  CCC_next
    0    4    5  100      50.0
    1    5    5   50     -30.0
    2    6   30  -30     -50.0
    3    7   40  -50       NaN
    

    ......然后做你想做的事,比如:

    >>> df['CCC'].sub(df['CCC_next'], fill_value=0)
    0    50.0
    1    80.0
    2    20.0
    3   -50.0
    dtype: float64
    >>> mask = df['CCC'].sub(df['CCC_next'], fill_value=0) >= 50
    >>> mask
    0     True
    1     True
    2    False
    3    False
    dtype: bool
    

    虽然对于你问题中的具体问题, diff 方法已经足够了 .

相关问题