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()