Pandas 在使用.loc时设置了复制警告

Pandas 在使用.loc时设置了复制警告,pandas,copy,Pandas,Copy,我试图根据条件更改数据帧列中的值 In [1]:df.head() Out[2]: gen cont timestamp 2012-07-01 00:00:00 0.293 0 2012-07-01 00:30:00 0.315 0 2012-0

我试图根据条件更改数据帧列中的值

In [1]:df.head()
Out[2]:                gen        cont  
timestamp                                                                   
2012-07-01 00:00:00        0.293        0    
2012-07-01 00:30:00        0.315        0    
2012-07-01 01:00:00        0.0          0    
2012-07-01 01:30:00        0.005        0    
2012-07-01 02:00:00        0.231        0    
每当两列之和低于阈值0.01时,我想将
'gen'
列设置为
NaN
,因此我想要的是:

In [1]:df.head()
Out[2]:                gen        cont  
timestamp                                                                   
2012-07-01 00:00:00        0.293        0    
2012-07-01 00:30:00        0.315        0    
2012-07-01 01:00:00        NaN          0    
2012-07-01 01:30:00        NaN          0    
2012-07-01 02:00:00        0.231        0  
我用过这个:

df.loc[df.gen + df.con <0.01 ,'gen'] = np.nan

我很困惑,因为我正在使用.loc,而且我认为我正在以建议的方式使用它

对我来说,你的解决方案很有效

使用的替代解决方案,默认情况下,如果条件为真,则添加
NaN

df['gen'] = df['gen'].mask(df['gen'] + df['cont'] < 0.01)
print (df)
             timestamp    gen  cont
0  2012-07-01 00:00:00  0.293     0
1  2012-07-01 00:30:00  0.315     0
2  2012-07-01 01:00:00    NaN     0
3  2012-07-01 01:30:00    NaN     0
4  2012-07-01 02:00:00  0.231     0

该代码除了使用点访问列,因为属性看起来是有效的,您必须在这之前做一些事情才能生成警告。您是否在这些行之前过滤了df我之前过滤过df,但警告是由这一行生成的。如果我在控制台中执行该行,它将复制warning@doctorer-您可以添加筛选代码吗?可能需要
df1=df.copy()
另外,你是说使用点是不好的做法吗?你需要显式调用
copy()
为了制作副本,你所做的是创建对原始df片段的引用,因此出现警告,因为您现在使用的是
.loc
,这意味着您打算处理df的视图。警告并不总是准确的,但它突出了潜在的问题,访问列的方法是一个旁注这不是OP想要的,他们想要删除警告,他们已经得到了想要的结果result@EdChum-对不起,我认为这是
编辑中的解决方案。或者缺少什么?我想保持df_不变,这就是我复制到新df的原因。是的,然后需要
copy
。另一个解决方案是
overwrite
全部更改为原始
df_in=df_in.loc[sDate:eDate]
,但这不是您想要的。好的,那么执行
copy
就是解决方案,当您声明我得到了我想要的结果,但生成了警告时,我以为您想影响原始df
df['gen'] = df['gen'].mask(df['gen'] + df['cont'] < 0.01)
print (df)
             timestamp    gen  cont
0  2012-07-01 00:00:00  0.293     0
1  2012-07-01 00:30:00  0.315     0
2  2012-07-01 01:00:00    NaN     0
3  2012-07-01 01:30:00    NaN     0
4  2012-07-01 02:00:00  0.231     0
df = df_in.loc[sDate:eDate].copy()