如果索引操作返回视图或副本是不确定的,那么pandas中的视图点是什么?

sjk*_*sjk 9 python views slice pandas

我已经从R换成了熊猫.当我做类似的事情时,我经常得到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!!
Run Code Online (Sandbox Code Playgroud)

我想我理解这个问题,虽然我很乐意了解我的错误.在给定的示例中,未定义是否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
Run Code Online (Sandbox Code Playgroud)

我认为有些东西是我遗漏的:如果我们真的无法确定我们是否创建了一个视图,那么哪些观点有用呢?来自pandas文档(http://pandas-docs.github.io/pandas-docs-travis/indexing.html?highlight=view#indexing-view-versus-copy)

除了简单的情况之外,很难预测它[ getitem ] 是否会返回一个视图或一个副本(它取决于数组的内存布局,关于哪个pandas不能保证)

对于不同的索引方法,可以找到类似的警告.

我觉得在我的代码中调用.copy()调用非常麻烦和错误.我使用错误的样式来操作我的DataFrames吗?或者表现是如此之高以至于证明了明显的尴尬?

nic*_*_eu 11

好问题!

简短的回答是:这是大熊猫的一个缺陷,正在得到补救.

你可以在这里找到一个关于问题性质的更长时间的讨论,但主要的一点是,我们现在正在转向"写时复制"行为,在这种行为中你随时切片,得到一个新副本,你永远不必考虑观点.该修复很快就会通过这个重构项目.我实际上试图直接修复它(见这里),但它在当前的架构中是不可行的.

事实上,我们将在背景中保持视图 - 它们使得pandas SUPER内存在提供时效率高且速度快 - 但我们最终会将它们隐藏在用户之外,因此,从用户的角度来看,如果切片,索引,或者剪切一个DataFrame,你得到的东西实际上是一个新的副本.

(这是通过在用户只读取数据时创建视图来完成的,但每当使用赋值操作时,视图将在分配之前转换为副本.)

最好的猜测是修复将在一年内 - 同时,我担心有些.copy()可能是必要的,对不起!