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

时间:2017-04-06 10:20:24

标签: 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-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    

每当2列的总和低于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

它给了我想要的结果但警告:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

我很困惑,因为我正在使用.loc,我想我是按照建议的方式使用它。

1 个答案:

答案 0 :(得分:3)

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

使用mask的替代解决方案,如果条件为NaN,则默认添加True

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

编辑:

您需要copy

如果稍后修改df中的值,您会发现修改不会传播回原始数据(df_in),并且Pandas会发出警告。

df = df_in.loc[sDate:eDate].copy()