我有一个名为df的主df,还有3个额外的dfs,简单地说是df2 = df,df3 = df,df4 = df。所以他们设置了我的主要df。
我在df中添加了一列,由于某种原因,它也被添加到df2,df3,df4。当我从df中删除列时,它也从df2,df3,df4中删除。
我确实创建了与主df略有不同的sub-dfs,它应该是创建数据帧的副本而不是视图 - 对吗?
答案 0 :(得分:2)
不,您创建了3个对orig df的引用,以进行复制
height:'100%'
这将进行深层复制,以便任何修改都会影响副本而不影响原始df。
您需要在代码中明确,以避免任何歧义。
另外做这样的事情:
df2 = df.copy()
可能会返回一个视图,但随后会对此进行修改:
df_maybe_a_view = df[some_cols]
这可能意味着原始df已被修改。
这里的问题是,你的意图变得含糊不清,很难确定你的引用是否在视图上运行。因此,您必须明确使用SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
制作副本并使用copy
和.loc
来设置值,请参阅docs
答案 1 :(得分:0)
您需要使用copy
:
Signature: pd.DataFrame.copy(self, deep=True)
Docstring:
Make a copy of this objects data.
Parameters
----------
deep : boolean or string, default True
Make a deep copy, including a copy of the data and the indices.
With ``deep=False`` neither the indices or the data are copied.
Note that when ``deep=True`` data is copied, actual python objects
will not be copied recursively, only the reference to the object.
This is in contrast to ``copy.deepcopy`` in the Standard Library,
which recursively copies object data.
Returns
-------
copy : type of caller
File: /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/core/generic.py
Type: function
当您编写df = pd.DataFrame()
时,它会创建一个对象,并为其指定一个名称df
。然后当你写df2 = df
时,所做的就是为同一个对象分配另一个名字。对于python中的所有对象都是如此 - 有对象,并且有些名称绑定到这些对象。因此,当您修改对象,并且其他名称指向同一个对象时,它们当然都会发生变化。
执行df2 = df.copy()
会创建一个新对象并为其指定df2
,这就是您想要的。