我已经从 R 切换到 pandas。当我做类似的事情时,我经常得到SettingWithCopyWarnings
df_a = pd.DataFrame({'col1': [1,2,3,4]})
# Filtering step, which may or may not return a view
df_b = df_a[df_a['col1'] > 1]
# Add a new column to df_b
df_b['new_col'] = 2 * df_b['col1']
# SettingWithCopyWarning!!
我想我理解这个问题,尽管我很乐意了解我做错了什么。在给定的示例中,未定义是否df_b
是对df_a
或不。因此,分配给的效果df_b
不清楚:是否有影响df_a
?该问题可以通过在过滤时显式进行复制来解决:
df_a = pd.DataFrame({'col1': [1,2,3,4]})
# Filtering step, definitely a copy now
df_b = df_a[df_a['col1'] > 1].copy()
# Add a new column to df_b
df_b['new_col'] = 2 * df_b['col1']
# No Warning now
我认为我遗漏了一些东西:如果我们永远无法真正确定我们是否创建了视图,那么视图有什么用呢?来自熊猫文档(http://pandas-docs.github.io/pandas-docs-travis/indexing.html?highlight=view#indexing-view-versus-copy)
除了简单的情况之外,很难预测它是否[getitem] 将返回一个视图或副本(这取决于数组的内存布局,pandas 对此不做保证)
对于不同的索引方法可以找到类似的警告。
我发现在我的代码中散布 .copy() 调用非常麻烦且容易出错。我是否使用了错误的风格来操作我的数据帧?或者性能增益是否如此之高,以至于证明了明显的尴尬是合理的?