8

パンダのデータフレームのサブセットに値を割り当てる一般的で効率的な方法はありますか? 直接アクセスできる何百もの行と列がありますが、各行と列のペアを反復せずにそれらの値を編集する方法を見つけることができませんでした。例えば:

In [1]: import pandas, numpy

In [2]: array = numpy.arange(30).reshape(3,10)

In [3]: df = pandas.DataFrame(array, index=list("ABC"))

In [4]: df
Out[4]: 
    0   1   2   3   4   5   6   7   8   9
A   0   1   2   3   4   5   6   7   8   9
B  10  11  12  13  14  15  16  17  18  19
C  20  21  22  23  24  25  26  27  28  29

In [5]: rows = ['A','C']

In [6]: columns = [1,4,7]

In [7]: df[columns].ix[rows]
Out[7]: 
    1   4   7
A   1   4   7
C  21  24  27

In [8]: df[columns].ix[rows] = 900

In [9]: df
Out[9]: 
    0   1   2   3   4   5   6   7   8   9
A   0   1   2   3   4   5   6   7   8   9
B  10  11  12  13  14  15  16  17  18  19
C  20  21  22  23  24  25  26  27  28  29

ここで起こっていることは、ビューではなくコピーを取得していることだと思います。つまり、元の DataFrame に割り当てることはできません。それは私の問題ですか?これらの行 x 列を編集する最も効率的な方法は何ですか (DataFrame が大量のメモリを消費する可能性があるため、できればインペースで)?

また、これらの値を正しい形状の DataFrame に置き換えたい場合はどうすればよいでしょうか?

4

1 に答える 1

11

loc代入式で使用します (=つまり、ビューかコピーかは関係ありません!):

In [11]: df.loc[rows, columns] = 99

In [12]: df
Out[12]:
    0   1   2   3   4   5   6   7   8   9
A   0  99   2   3  99   5   6  99   8   9
B  10  11  12  13  14  15  16  17  18  19
C  20  99  22  23  99  25  26  99  28  29

0.11 より前のバージョンを使用している場合は、.ix.

@Jeffのコメントとして:

これは割り当て式 (ドキュメントの「ix による高度なインデックス作成」セクションを参照) であり、何も返しません (ただし、や などを返す割り当て式があります)。 .at.iat

df.loc[rows,columns] ビューを返すことができますが、通常はコピーです。紛らわしいですが、効率のために行われます。

結論: 、、を使用して (上記のように)設定し、コピーを変更しないでください。ixlociloc

ドキュメントの「ビューとコピー」セクションを参照してください。

于 2013-07-09T20:38:06.360 に答える