2017-05-17 3 views
0

私は(、パンダ0.19.2時点を使用してのpython 3.5)を、以下の奇妙な行動を持って 私は、データフレームの辞書に設定した場合:データフレームのpandas辞典:列が変更されました:表示またはコピーしますか?

df1 = pd.DataFrame(index=['a', 'b'], columns=['c1', 'c2'], data=[[0,1],[2,3]]) 
df2 = pd.DataFrame(index=['a', 'b'], columns=['c1', 'c2'], data=[[4,5],[6,7]]) 

my_dict = {'f1': df1, 'f2': df2} 

を、私は列をこのように変更しよう:

d = [] 
for key in my_dict.keys(): 
    df = my_dict.get(key) 
    df.columns = [(key, x) for x in df.columns] 
    d.append(df) 

私は最終的に辞書の値の列を変更しました。
だからmy_dict今ある:

{'f1': (f1, c1) (f1, c2) 
a   0   1 
b   2   3, 
'f2': (f2, c1) (f2, c2) 
a   4   5 
b   6   7} 

そのためいかなる理由がありますか?
参照されている要素を変更するのは奇妙で(バグがある)

答えて

0

バグではなく、コピーの代わりにビューを作成した場所を見逃すだけです。あなたは辞書にデータフレームを使用しているので、次の行は、元DFのビューを作成します

df = my_dict.get(key) 

あなたは

df = my_dict.get(key).copy() 
+0

感謝を試してみたいことがあります。それはちょうどその私が 'my_dict =としての私の辞書定義した場合{ 'F1':1、 'F2':2}' を、私はmy_dict.keysでキーの 'dは= []' '次のようにします(df) ' ' df = my_dict.get(key) ' ' df = 2' 'd.append(df)' 'my_dict'は変更されません。 ビューまたはコピーが返される時点を指すポインタがありますか? –

1

さて、あなたはそれが奇妙見つけるかもしれない(と私は同意するかもしれない)、それは文書化されていません。

辞書はpythonで変更可能です:https://docs.python.org/2/reference/datamodel.html

オブジェクトの可変性は、その種類によって決定されます。例えば、 数字、文字列、タプルは不変ですが、辞書と リストは、となります。

コンテナの例には、タプル、リスト、辞書があります。 参照はコンテナの値の一部です。ほとんどの場合、 がコンテナの値について話すとき、我々は含まれているオブジェクトの識別子ではなく値を暗示します。しかしながら、コンテナの の可変性について話し合ったときには、ただちに のオブジェクトを含むアイデンティティだけが暗示されます。 あれば、( タプルなど)場合不変容器は可変オブジェクトが変更されたことを、その値が変化する可変オブジェクトへの参照を含みます。

パンダデータフレームは変更可能である。 http://pandas.pydata.org/pandas-docs/stable/overview.html#mutability-and-copying-of-data

可変性とデータ

のコピーすべてパンダデータ構造 値、可変である(それらが含む値を変更することができます)[ ...]

たとえば、データフレームを関数に入力として渡すことができます。関数内では、列の名前を変更し、効果として関数外のデータフレームも変更されます。

関連する問題