Python Pandas:数据帧和用于定义它的numpy.array之间的关系

Python Pandas:数据帧和用于定义它的numpy.array之间的关系,python,arrays,pandas,numpy,dataframe,Python,Arrays,Pandas,Numpy,Dataframe,我只想创建两个相同维度的数据帧,它们最初是空的。我是这样做的: import numpy as np import pandas as pd m = np.empty((2, 3))*np.nan df1 = pd.DataFrame(m) df2 = pd.DataFrame(m) 但当我在一个数据帧中更改特定值时,所有三个对象都会受到影响: df2.iloc[1, 2] = 1 print(df2) 0 1 2 0 NaN NaN NaN 1 NaN NaN 1.

我只想创建两个相同维度的数据帧,它们最初是空的。我是这样做的:

import numpy as np
import pandas as pd

m = np.empty((2, 3))*np.nan
df1 = pd.DataFrame(m)
df2 = pd.DataFrame(m)
但当我在一个数据帧中更改特定值时,所有三个对象都会受到影响:

df2.iloc[1, 2] = 1

print(df2)
    0   1    2
0 NaN NaN  NaN
1 NaN NaN  1.0

print(df1)
    0   1    2
0 NaN NaN  NaN
1 NaN NaN  1.0

print(m)
array([[nan, nan, nan],
       [nan, nan,  1.]])

因此,数据帧似乎只是一个numpy数组的包装器:没有复制。我没有在任何地方看到这种行为的记录,我只是想指出它。有什么意见吗?

我认为这是因为
df1
df2
是指向同一内存地址的指针。如果您不熟悉指针,请参阅示例。
解决此问题的快速方法是将共享numpy数组复制到新数组中:

 import numpy as np
import pandas as pd

m = np.empty((2, 3))*np.nan
n = m.copy()
df1 = pd.DataFrame(m)
df2 = pd.DataFrame(n)

df2.iloc[1, 2] = 1

print(df1)
print(df2)

我认为这是因为
df1
df2
是指向同一内存地址的指针。如果您不熟悉指针,请参阅示例。
解决此问题的快速方法是将共享numpy数组复制到新数组中:

 import numpy as np
import pandas as pd

m = np.empty((2, 3))*np.nan
n = m.copy()
df1 = pd.DataFrame(m)
df2 = pd.DataFrame(n)

df2.iloc[1, 2] = 1

print(df1)
print(df2)

有一个initarg to DataFrame,让您指定将数据从ndarray复制到DataFrame

请参阅pandas、line和更高版本的源代码。。。 默认情况下,“复制”为False

因此,您可以通过以下方式强制复制:

import numpy as np
import pandas as pd

m = np.empty((2, 3))*np.nan
df1 = pd.DataFrame(m,copy=True)
df2 = pd.DataFrame(m)

df2.iloc[1, 2] = 1
print(df1)
print(df2)

有一个initarg to DataFrame,让您指定将数据从ndarray复制到DataFrame

请参阅pandas、line和更高版本的源代码。。。 默认情况下,“复制”为False

因此,您可以通过以下方式强制复制:

import numpy as np
import pandas as pd

m = np.empty((2, 3))*np.nan
df1 = pd.DataFrame(m,copy=True)
df2 = pd.DataFrame(m)

df2.iloc[1, 2] = 1
print(df1)
print(df2)

这种行为背后的理念是,numpy和pandas是为提高效率而设计的。因此,开发人员的理念是:只有在必要时才会复制内容

例如:

a=np.ones((2,3))
df=pd.DataFrame(a)
df.iloc[0,0]="string" 

In [2]: a
Out[2]: 
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])

In [3]: df
Out[3]: 
        0    1    2
0  string  1.0  1.0
1       1  1.0  1.0

在这种情况下,由于数据类型发生了更改,因此会生成一个副本。

此行为背后的理念是numpy和pandas的设计是为了提高效率。因此,开发人员的理念是:只有在必要时才会复制内容

例如:

a=np.ones((2,3))
df=pd.DataFrame(a)
df.iloc[0,0]="string" 

In [2]: a
Out[2]: 
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])

In [3]: df
Out[3]: 
        0    1    2
0  string  1.0  1.0
1       1  1.0  1.0

在这种情况下,由于数据类型发生了更改,因此会制作一个副本。

我不知道熊猫的情况,但对于numpy来说,这是预期的行为。numpy仅在必要时制作副本。切片、转置、重塑等创建相同数据的新视图。我不知道熊猫如何,但对于numpy来说,这是预期的行为。numpy仅在必要时制作副本。切片、转置、重塑等创建相同数据的新视图。这很棒。我最初修改了我的代码,所以它会说
df1=pd.DataFrame(np.copy(m))
,但我更喜欢你的替代方案。这很好。我最初修改了我的代码,所以它会说
df1=pd.DataFrame(np.copy(m))
,但我更喜欢你的替代方案。这对我来说是有意义的。这对我来说是有意义的。