Python 为什么使用inplace=True重命名dataframe列会触发带有复制警告的设置?

Python 为什么使用inplace=True重命名dataframe列会触发带有复制警告的设置?,python,pandas,Python,Pandas,数据帧kidsingelheads94_98是从数据帧mydata94_98创建的。kidsingleheads94\u 98的.is\u copy属性显示对mydata94\u 98的弱引用 >>> kidsSingleHeads94_98.is_copy <weakref at 0x000000010ECE0EF8; to 'DataFrame' at 0x000000010DCDE048> >>> hex(id(mydata94_98)) '

数据帧
kidsingelheads94_98
是从数据帧
mydata94_98
创建的。
kidsingleheads94\u 98
.is\u copy
属性显示对
mydata94\u 98
的弱引用

>>> kidsSingleHeads94_98.is_copy
<weakref at 0x000000010ECE0EF8; to 'DataFrame' at 0x000000010DCDE048>
>>> hex(id(mydata94_98))
'0x10dcde048'
我一直在努力理解视图和副本之间的区别。我理解在数据帧视图上的设置会修改它,而在数据帧副本上的设置不会修改它

来自韦斯·麦金尼的《数据分析用Python》第114页

为数据帧编制索引时返回的列是基础数据的视图,而不是副本。因此,对该系列的任何就地修改都将反映在数据帧中。可以使用序列“copy方法显式复制列

我认为,将数据帧子设置为另一个子集并使用该子集将值设置为其他值可以创建副本,这可能会因为将新数据写入内存的额外工作而代价高昂?我不清楚

注意


我设置了
pd.options.mode.chained\u赋值='raise'
,这样python就会引发异常并使程序崩溃。我在错误消息中使用了回溯,以便准确地找到触发
设置WithCopy
问题的命令。默认设置为“警告”

kidsingelheads94_98
仍然链接到
mydata94_98
会导致警告。修改
kidsSingleHeads94_98
会间接修改
mydata94_98
。这就是复制警告的内容;这不是因为
mydata94_98
正在进行更改。
mydata94_98
中的列名仍然是相同的
mydata94_98
可能根本不会更改,因为
mydata94_98
kidsingelhead94_98
之间的引用是一个
weakref
。由于
pd.options.mode.chained_assignment
设置为“warn”,因此可以在不影响第一个数据帧的情况下对第二个数据帧进行修改。
kidsSingleHeads.rename( columns = { "Gender":"GenderChild", 
                                    "Age":"AgeChild", 
                                    "EducationYears":"EducationYearsChild" }, inplace = True )
pandas.core.common.SettingWithCopyError:
A value is trying to be set on a copy of a slice from a DataFrame