为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕标5832272 2021-09-11 17:49:22
在 pandas 文档说明书的 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  -50df.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之间的差值大于或等于 50 的任何位置。然后我想创建一个条件,该条件为我提供以下数据框:df.CCCdf.CCC#    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 >= 50df.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[]?
查看完整描述

2 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

给定的


>>> 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方法就足够了。


查看完整回答
反对 回复 2021-09-11
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

您可以使用 enumerate 函数同时访问行及其索引。因此,您可以根据当前行的索引获取上一行和下一行。我在下面提供了一个示例脚本供您参考:


import pandas as pd


df = pd.DataFrame({'AAA' : [4,5,6,7],

                   'BBB' : [10,20,30,40],

                   'CCC' : [100,50,-30,-50]}, index=['a','b','c','d'])


print('row_pre','row_pre_AAA','row','row_AA','row_next','row_next_AA')

for irow, row in enumerate(df.index):

    if irow==0:

        row_next = df.index[irow+1]

        print('row_pre', "df.loc[row_pre,'AAA']", row, df.loc[row,'AAA'], row_next, df.loc[row_next,'AAA'])

    elif irow>0 and irow<df.index.size-1:

        row_pre = df.index[irow-1]

        row_next = df.index[irow+1]

        print(row_pre, df.loc[row_pre,'AAA'], row, df.loc[row,'AAA'], row_next, df.loc[row_next,'AAA'])

    else:

        row_pre = df.index[irow-1]

        print(row_pre, df.loc[row_pre,'AAA'], row, df.loc[row,'AAA'], 'row_next', "df.loc[row_next,'AAA']")


输出如下:


row_pre row_pre_AAA row row_AA row_next row_next_AA

row_pre df.loc[row_pre,'AAA'] a 4 b 5

a 4 b 5 c 6

b 5 c 6 d 7

c 6 d 7 row_next df.loc[row_next,'AAA']


查看完整回答
反对 回复 2021-09-11
  • 2 回答
  • 0 关注
  • 566 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信