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的可变性,我应该注意的任何其他观点都将非常感激.
这个:
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)
所以数据会之间共享df2和df1默认.如果您希望不存在共享,而是完整副本,请执行以下操作:
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,这种风格非常不清楚,所以我建议不要编写这样的代码。相反,如果您不需要副本,只需这样说:
Run Code Online (Sandbox Code Playgroud)df2 = df1.iloc[2:3,1:2]总之:如果您想要引用现有数据,请不要调用 > pd.DataFrame() 或任何其他方法。如果你想要一个独立的副本,请调用 .copy()
我不同意。执行上述操作仍然会返回对原始 DataFrame 的切片部分的引用。因此,如果您对 df2 进行任何更改,它将反映在 df1 中。
相反,应该使用 .copy(),
df2 = df1.iloc[2:3,1:2].copy()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5287 次 |
| 最近记录: |