我尝试根据条件更改数据框列中的值。
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,我想我是按照建议的方式使用它。
答案 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()