Pandas DataFrameを作成しました
df = DataFrame(index=['A','B','C'], columns=['x','y'])
ここで、特定のセル、たとえば行C
と列に値を割り当てたいと思いますx
。つまり、次の変換を実行したいと思います。
x y x y
A NaN NaN A NaN NaN
B NaN NaN ⟶ B NaN NaN
C NaN NaN C 10 NaN
このコードで:
df.xs('C')['x'] = 10
しかし、 の内容はdf
変更されていません。データフレームには、やはり のみが含まれていますNaN
。どうすれば、必要な結果が得られるでしょうか?
ベストアンサー1
RukTechの回答、、df.set_value('C', 'x', 10)
は私が以下で提案したオプションよりもはるかに高速です。しかし、廃止予定。
今後、推奨される方法は.iat/.at
。
df.xs('C')['x']=10
動作しない理由:
df.xs('C')
デフォルトでは新しいデータフレームを返しますコピー付きデータの
df.xs('C')['x']=10
この新しいデータフレームのみを変更します。
df['x']
データフレームのビューを返すdf
ので、
df['x']['C'] = 10
自身を変更しますdf
。
警告: 操作がコピーを返すかビューを返すかを予測することが難しい場合があります。このため、ドキュメントでは「連鎖インデックス」による割り当てを避けることを推奨しています。
そこで推奨される代替案は
df.at['C', 'x'] = 10
これはを変更しますdf
。
In [18]: %timeit df.set_value('C', 'x', 10)
100000 loops, best of 3: 2.9 µs per loop
In [20]: %timeit df['x']['C'] = 10
100000 loops, best of 3: 6.31 µs per loop
In [81]: %timeit df.at['C', 'x'] = 10
100000 loops, best of 3: 9.2 µs per loop