gpt4 book ai didi

python - 如何在for循环if语句中处理 “SettingWithCopyWarning”

转载 作者:行者123 更新时间:2023-12-01 08:04:37 26 4
gpt4 key购买 nike

假设 A 列是基于时间的,B 列是工资。

我在 for 循环中使用 if 语句,试图查找“所有低于前一个但也大于后一个的工资”。然后将新值(“YES”)分配给满足条件的行的另一列(C 列)。最后,我想抓取满足上述条件的第一列A。

数据框如下所示:

In [1]:
df = pd.DataFrame({'A':['2007q3','2007q4','2008q1','2008q2','2008q3','2008q4','2009q1','2009q2','2009q3'],
'B':[14938, 14991, 14899, 14963, 14891, 14577, 14375, 14355, 14402]})
df['C'] = pd.Series()
df

Out [1]:
A B C
0 2007q3 14938 NaN
1 2007q4 14991 NaN
2 2008q1 14899 NaN
3 2008q2 14963 NaN
4 2008q3 14891 NaN
5 2008q4 14577 NaN
6 2009q1 14375 NaN
7 2009q2 14355 NaN
8 2009q3 14402 NaN

以下代码可以正常工作,但显示“SettingWithCopyWarning”警告,我不确定代码的哪些部分导致了问题...

In [2]:
for i in range(1, len(df)-1):
if (df['B'][i] < df['B'][i-1]) & (df['B'][i] > df['B'][i+1]):
df['C'][i] = 'YES'
df

Out [2]:
A B C
0 2007q3 14938 NaN
1 2007q4 14991 NaN
2 2008q1 14899 NaN
3 2008q2 14963 NaN
4 2008q3 14891 YES
5 2008q4 14577 YES
6 2009q1 14375 YES
7 2009q2 14355 NaN
8 2009q3 14402 NaN

In [3]: df['A'][df['C'] == 'YES'].iloc[0]
Out [3]:'2008q3'

或者也许有更好的方法来完成工作。谢谢!!!

最佳答案

有关为什么您收到 SettingWithCopyWarning 的更多详细信息,我建议您阅读 this answer 。这主要是因为选择 df['C'] 列,然后选择带有 [i] 的行会执行“链式赋值”,当您执行 df['C'][i] = 'YES'

时,会以这种方式标记

对于您尝试执行的操作,您可以使用 np.whereshift在 B 列上,例如:

import numpy as np
df['C'] = np.where((df.B < df.B.shift()) & (df.B > df.B.shift(-1)), 'YES', np.nan)

你会得到相同的输出。

关于python - 如何在for循环if语句中处理 “SettingWithCopyWarning”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55597317/

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