Python 如何处理“;设置为CopyWarning”;在for循环if语句中

Python 如何处理“;设置为CopyWarning”;在for循环if语句中,python,pandas,Python,Pandas,假设A列是基于时间的,B列是基于工资的 我在for循环中使用if语句,试图找到“所有低于上一个但也高于下一个的薪资”。然后将一个新值('YES')分配给满足条件的行的另一列(C列)。最后,我想获取满足上述条件的第一列A 数据帧如下所示: In [1]: df = pd.DataFrame({'A':['2007q3','2007q4','2008q1','2008q2','2008q3','2008q4','2009q1','2009q2','2009q3'],

假设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'
[2]中的

对于范围(1,透镜(df)-1)内的i:
如果(df['B'][i]df['B'][i+1]):
df['C'][i]=“是”
df
出[2]:
A、B、C
0 2007q3 14938 NaN
2007年第1季度14991南
2 2008q1 14899南
3 2008q2 14963南
4 2008q3 14891是
5 2008年第4季度14577是
6 2009年第1季度14375是
7 2009q2 14355南
8 2009q3 14402南
在[3]中:df['A'][df['C']=='YES'].iloc[0]
Out[3]:'2008q3'

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

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

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

import numpy as np
df['C'] = np.where((df.B < df.B.shift()) & (df.B > df.B.shift(-1)), 'YES', np.nan) 
将numpy导入为np
df['C']=np.where((df.Bdf.B.shift(-1)),'YES',np.nan)
你会得到同样的结果