我有一个包含多个列的数据框。 之后,添加了标题为“活动”的列。 如果'Volume'列包含大于0的任何内容,我需要将'Active'设置为1。
这是我尝试过的一个简单例子:
import pandas as pd
active_df = pd.DataFrame(columns=['Volume'])
active_df['Volume'] = 0, 0, 22, 22, 0, 22, 0, 22, 0, 22
active_df['Active'] = 0
active_df['Active'].loc[active_df['Volume'] > 0] = 1
print(active_df)
虽然这会产生预期的结果,但我不断收到警告:“正在尝试在DataFrame的切片副本上设置值”
我已阅读引用页面:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy但仍无法解决此问题。
我认为我已经在其他代码中处理了这个并解决了它,但我在现有代码中找不到示例。
答案 0 :(得分:1)
我认为副本和视图的内部结构与通过版本不同,因为我没有使用0.20.3
发出警告。
我完全理解,如果最新版本会将一些视图操作移动到副本中,考虑到导致的混乱和可能的错误。
所有版本最安全的选项是:
active_df.loc[active_df['Volume'] > 0, 'Active'] = 1
您可以随时仔细检查过滤后的数据框是副本还是视图:
active_df['Active'].loc[active_df['Volume'] > 0].is_view
答案 1 :(得分:1)
在最近的投票中提出了一年后,我重新发现了这个问题。 自问起以来,我已经对Pandas有了更多的了解,我想我会重新审视我的“切片副本”和解决方案中的区别。
我最初的尝试是:
active_df['Active'].loc[active_df['Volume'] > 0] = 1
充其量只是一种令人费解的方式。
首先,我要获取active_df ['Volume']> 0的布尔值 然后,当行值为TRUE时,我将切片active_df ['Active']设置为1。 尽管这样做可行,但是不确定这是数据框的视图还是副本。
解决方案是:
active_df.loc[active_df['Volume'] > 0, 'Active'] = 1
在active_df数据框中,找到active_df ['Volume']> 0所在的行和“ Active”列,并将这些值设置为1。
或者用另一种方式表示:对于“卷”列中值为0的行,将“活动”列的值设置为1。
因此,您实际上是在处理整个数据帧(active_df.loc),而不是切片和可能的副本(active_df ['Active']。loc)
再次感谢@Deena提供解决方案。