7

複製されたパンダのDataFrameを変更するのに少し問題があり、複製元のDataFrameの両方に編集が適用されません。

これが例です。辞書のリストから任意のDataFrameを作成するとします。

In [67]: d = [{'a':3, 'b':5}, {'a':1, 'b':1}]

In [68]: d = DataFrame(d)

In [69]: d

Out[69]: 
   a  b
0  3  5
1  1  1

次に、「d」データフレームを変数「e」に割り当て、applyを使用して列「a」に任意の計算を適用します。

In [70]: e = d

In [71]: e['a'] = e['a'].apply(lambda x: x + 1)

問題は、適用関数が重複したDataFrame'e'と元のDataFrame'd'の両方に明らかに適用されるという点で発生します。これは、私が一生理解できないことです。

In [72]: e # duplicate DataFrame
Out[72]: 
   a  b
0  4  5
1  2  1

In [73]: d # original DataFrame, notice the alterations to frame 'e' were also applied
Out[73]:  
   a  b
0  4  5
1  2  1

パンダのドキュメントとGoogleの両方を検索して、そうなる理由を探しましたが、役に立ちませんでした。ここで何が起こっているのか全く理解できません。

また、要素ごとの演算(たとえば)を使用して数学演算を試しましたe['a'] = [i + 1 for i in e['a']]が、問題は解決しません。私が気付いていないパンダのDataFrameタイプに癖はありますか?誰かが提供できるかもしれない洞察に感謝します。

4

1 に答える 1

13

これはパンダ固有の問題ではありません。Pythonでは、代入によって何もコピーされることはありません。

>>> a = [1,2,3]
>>> b = a
>>> b[0] = 'WHOA!'
>>> a
['WHOA!', 2, 3]

新しいDataFrameが必要な場合は、を使用してコピーを作成しe = d.copy()ます。

編集:裸の名前への割り当ては決して何もコピーしないことを明確にする必要があります。a[1] = xアイテムまたは属性(または)への割り当ては、内部a.foo = barでメソッド呼び出しに変換され、オブジェクトの種類に応じてコピーを実行する場合がありますa

于 2012-06-01T05:13:47.773 に答える