簡體   English   中英

使用pandas為什么`DataFrame(foo)是foo` = False?

[英]With pandas why does `DataFrame(foo) is foo` = False?

從示例開始......

In [1]: import pandas as pd

In [2]: from sklearn.datasets import load_iris

In [3]: iris = load_iris()

In [4]: X = pd.DataFrame(data=iris.data, columns=iris.feature_names)

In [5]: output_df = pd.DataFrame(X)

In [6]: X is output_df
Out[6]: False

In [7]: list(X.columns)
Out[7]: 
['sepal length (cm)',
 'sepal width (cm)',
 'petal length (cm)',
 'petal width (cm)']

In [8]: output_df['y'] = iris.target

In [9]: list(X.columns)
Out[9]: 
['sepal length (cm)',
 'sepal width (cm)',
 'petal length (cm)',
 'petal width (cm)',
 'y']

[6]X is output_dfFalse ,這意味着它們不是同一個對象。 如果它們不是同一個對象,則向其中一個添加列不應影響另一個。

然而[9]告訴我們在output_df中添加一個列肯定會向X添加相同的列,這意味着它們實際上是同一個對象。

為什么這里有斷線?

pd.__version__ == 0.24.1python --version = Python 3.7.1 ,如果重要的話)

DataFrame與其底層數據之間存在一些分離,這些數據存儲在其BlockManager 在您的示例中,底層BlockManager數據是相同的,因此在一個DataFrameDataFrame它將影響另一個:

In [1]: import pandas as pd; pd.__version__
Out[1]: '0.24.1'

In [2]: df = pd.DataFrame({'A': list('abc'), 'B': [10, 20, 30]})

In [3]: df2 = pd.DataFrame(df)

In [4]: df is df2
Out[4]: False

In [5]: df._data is df2._data
Out[5]: True

In [6]: df._data
Out[6]:
BlockManager
Items: Index(['A', 'B'], dtype='object')
Axis 1: RangeIndex(start=0, stop=3, step=1)
IntBlock: slice(1, 2, 1), 1 x 3, dtype: int64
ObjectBlock: slice(0, 1, 1), 1 x 3, dtype: object

本質上, DataFrame充當底層數據的包裝器,因此它們實際上是不同的對象,只是它們的某些組件碰巧被共享。 作為一個基本示例,您可以在不影響另一個的情況下向其中添加虛擬屬性:

In [7]: df.foo = 'bar'

In [8]: df.foo
Out[8]: 'bar'

In [9]: df2.foo
---------------------------------------------------------------------------
AttributeError: 'DataFrame' object has no attribute 'foo'

要解決共享底層數據的問題,您需要明確告訴DataFrame構造函數通過copy參數復制輸入數據:

In [10]: df2 = pd.DataFrame(df, copy=True)

In [11]: df._data is df2._data
Out[11]: False

In [12]: df['C'] = [1.1, 2.2, 3.3]

In [13]: df
Out[13]:
   A   B    C
0  a  10  1.1
1  b  20  2.2
2  c  30  3.3

In [14]: df2
Out[14]:
   A   B
0  a  10
1  b  20
2  c  30

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM