Pandas DataFrame可变性

use*_*493 5 python dataframe pandas

我对Panda的Dataframe很新,如果有人可以通过以下示例简要讨论DataFrame的可变性,我将非常感激:

d1=pd.date_range('1/1/2016',periods=10,freq='w')
col1=['open','high','low','close']
list1=np.random.rand(10,4)
df1=pd.DataFrame(list1,d1,col1)
Run Code Online (Sandbox Code Playgroud)

据我了解,目前df1是对df对象的引用.

如果我将df1或df1(例如df1.iloc[2:3,1:2])的切片作为新df的输入传递(例如df2=pd.DataFrame(df1)),df2是否会返回一个新的dataframe实例,或者仍然指的是使df1暴露给df2的df1?

关于DataFrame的可变性,我应该注意的任何其他观点都将非常感激.

Joh*_*nck 9

这个:

df2 = pd.DataFrame(df1)
Run Code Online (Sandbox Code Playgroud)

构造一个新的DataFrame.有一个copy参数的默认参数是False.根据文档,它意味着:

> Copy data from inputs. Only affects DataFrame / 2d ndarray input
Run Code Online (Sandbox Code Playgroud)

所以数据会之间共享df2df1默认.如果您希望不存在共享,而是完整副本,请执行以下操作:

df2 = pd.DataFrame(df1, copy=True)
Run Code Online (Sandbox Code Playgroud)

或者更简洁和惯用:

df2 = df1.copy()
Run Code Online (Sandbox Code Playgroud)

如果你这样做:

df2 = df1.iloc[2:3,1:2].copy()
Run Code Online (Sandbox Code Playgroud)

您将再次获得一份独立副本.但是如果你这样做:

df2 = pd.DataFrame(df1.iloc[2:3,1:2])
Run Code Online (Sandbox Code Playgroud)

它可能会共享数据,但如果您打算修改这种风格还不太清楚df,所以我建议不要编写这样的代码.相反,如果你不想复制,只需这样说:

df2 = df1.iloc[2:3,1:2]
Run Code Online (Sandbox Code Playgroud)

总结:如果您想要引用现有数据,请不要调用pd.DataFrame()或任何其他方法.如果您想要一个独立的副本,请致电.copy().


小智 5

它可能会共享数据,但是如果您打算修改 df,这种风格非常不清楚,所以我建议不要编写这样的代码。相反,如果您不需要副本,只需这样说:

df2 = df1.iloc[2:3,1:2]
Run Code Online (Sandbox Code Playgroud)

总之:如果您想要引用现有数据,请不要调用 > pd.DataFrame() 或任何其他方法。如果你想要一个独立的副本,请调用 .copy()

我不同意。执行上述操作仍然会返回对原始 DataFrame 的切片部分的引用。因此,如果您对 df2 进行任何更改,它将反映在 df1 中。

相反,应该使用 .copy(),

df2 = df1.iloc[2:3,1:2].copy()
Run Code Online (Sandbox Code Playgroud)