Pandas DataFrame可变性

问题描述 投票:4回答:3

我是Pandas 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)

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

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

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

python pandas dataframe
3个回答
7
投票

这个:

df2 = pd.DataFrame(df1)

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

> Copy data from inputs. Only affects DataFrame / 2d ndarray input

因此,默认情况下,数据将在df2df1之间共享。如果您希望不存在共享,而是完整副本,请执行以下操作:

df2 = pd.DataFrame(df1, copy=True)

或者更简洁和惯用:

df2 = df1.copy()

如果你这样做:

df2 = df1.iloc[2:3,1:2].copy()

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

df2 = pd.DataFrame(df1.iloc[2:3,1:2])

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

df2 = df1.iloc[2:3,1:2]

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


3
投票

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

df2 = df1.iloc[2:3,1:2]

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

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

而应该使用.copy(),

df2 = df1.iloc[2:3,1:2].copy()

1
投票

好问题,谢谢。在阅读完其他答案后,我最终玩了一会儿。所以我想和你分享一下。

这里有一些游戏代码:

import pandas as pd
import numpy as np
df=pd.DataFrame([[1,2,3],[4,5,6]])
print('start',df,sep='\n',end='\n\n')
def testAddCol(df):
    df=pd.DataFrame(df, copy=True) #experiment in this line: df=df.copy(), df=df.iloc[:2,:2], df.iloc[:2,:2].copy(), nothing, ...
    df['newCol']=11
    df.iloc[0,0]=100
    return df
df2=testAddCol(df)
print('df',df,sep='\n',end='\n\n')
print('df2',df2,sep='\n',end='\n\n')

输出:

start
   0  1  2
0  1  2  3
1  4  5  6

df
   0  1  2
0  1  2  3
1  4  5  6

df2
     0  1  2  newCol
0  100  2  3      11
1    4  5  6      11
© www.soinside.com 2019 - 2024. All rights reserved.