14

概要:これは機能しません:

df[df.key==1]['D'] = 1

しかし、これはします:

df.D[df.key==1] = 1

なんで?

再生:

In [1]: import pandas as pd

In [2]: from numpy.random import randn

In [4]: df = pd.DataFrame(randn(6,3),columns=list('ABC'))

In [5]: df
Out[5]: 
          A         B         C
0  1.438161 -0.210454 -1.983704
1 -0.283780 -0.371773  0.017580
2  0.552564 -0.610548  0.257276
3  1.931332  0.649179 -1.349062
4  1.656010 -1.373263  1.333079
5  0.944862 -0.657849  1.526811

In [6]: df['D']=0.0

In [7]: df['key']=3*[1]+3*[2]

In [8]: df
Out[8]: 
          A         B         C  D  key
0  1.438161 -0.210454 -1.983704  0    1
1 -0.283780 -0.371773  0.017580  0    1
2  0.552564 -0.610548  0.257276  0    1
3  1.931332  0.649179 -1.349062  0    2
4  1.656010 -1.373263  1.333079  0    2
5  0.944862 -0.657849  1.526811  0    2

これは機能しません:

In [9]: df[df.key==1]['D'] = 1

In [10]: df
Out[10]: 
          A         B         C  D  key
0  1.438161 -0.210454 -1.983704  0    1
1 -0.283780 -0.371773  0.017580  0    1
2  0.552564 -0.610548  0.257276  0    1
3  1.931332  0.649179 -1.349062  0    2
4  1.656010 -1.373263  1.333079  0    2
5  0.944862 -0.657849  1.526811  0    2

しかし、これはします:

In [11]: df.D[df.key==1] = 3.4

In [12]: df
Out[12]: 
          A         B         C    D  key
0  1.438161 -0.210454 -1.983704  3.4    1
1 -0.283780 -0.371773  0.017580  3.4    1
2  0.552564 -0.610548  0.257276  3.4    1
3  1.931332  0.649179 -1.349062  0.0    2
4  1.656010 -1.373263  1.333079  0.0    2
5  0.944862 -0.657849  1.526811  0.0    2

ノートブックへのリンク

私の質問は:

なぜ2番目の方法だけが機能するのですか?選択/インデックス作成ロジックに違いが見られないようです。

バージョンは0.10.0です

編集:これはもうこのように行われるべきではありません。バージョン0.11以降、があり.locます。ここを参照してください:http://pandas.pydata.org/pandas-docs/stable/indexing.html

4

2 に答える 2

17

パンダのドキュメントには次のように書かれています。

ビューとコピーを返す

データのビューがいつ返されるかに関するルールは、NumPyに完全に依存しています。ラベルの配列またはブールベクトルがインデックス作成操作に含まれる場合は常に、結果はコピーになります。単一のラベル/スカラーのインデックス付けとスライス(df.ix [3:6]やdf.ix [:、'A']など)を使用すると、ビューが返されます。

最初にdf[df.key==1]['D']ブールスライス(データフレームのコピーにつながる)を実行し、次に列['D']を選択します。

ではdf.D[df.key==1] = 3.4、最初に列を選択し、次に結果のシリーズでブールスライスを実行します。

これは違いを生むようですが、少し直感に反していることを認めなければなりません。

編集:違いはDougalによって識別されました。彼のコメントを参照してください:バージョン1では、__getitem__ブールスライスのメソッドが呼び出されたときにコピーが作成されます。バージョン2の場合、__setitem__メソッドのみがアクセスされます。したがって、コピーを返すのではなく、割り当てるだけです。

于 2013-01-07T09:32:27.723 に答える
4

私はあなたの最初の方法がビューの代わりにコピーを返すことであると確信しているので、それに割り当てても元のデータは変更されません。しかし、なぜこれが起こっているのかわかりません。

これは、列を取得するための構文ではなく、行と列を選択する順序に関連しているようです。これらは両方とも機能します。

df.D[df.key == 1] = 1
df['D'][df.key == 1] = 1

そして、これらの作品はどちらも:

df[df.key == 1]['D'] = 1
df[df.key == 1].D = 1

この証拠から、スライスdf[df.key == 1]がコピーを返していると思います。しかし、そうではありません!df[df.key == 1] = 0ビューであるかのように、実際には元のデータを変更します。

ですから、よくわかりません。私の感覚では、この動作はパンダのバージョンによって変更されました。df.Dはコピーを返し、df ['D']はビューを返すために使用されたことを覚えているようですが、これはもう真実ではないようです(pandas0.10.0)。

より完全な回答が必要な場合は、pystatsmodelsフォーラムに投稿する必要があります: https ://groups.google.com/forum/?fromgroups#!forum / pystatsmodels

于 2013-01-07T09:27:17.380 に答える