gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:14:58 25 4
gpt4 key购买 nike

在 pandas 文档的 if-then 部分下 cookbook ,我们可以根据使用 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.CCCdf.CCC 之间的差异处分配 df.BBB=5 > 下一行的大于或等于 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[] 对 pandas 执行此操作?

最佳答案

给定

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

您可以先通过以下方式计算一个 bool 掩码

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

关于python - 访问 pandas .loc[] 赋值中的下一行、上一行或当前行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53694241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com