1. ホーム
  2. python

[解決済み] pandas DataFrameの特定のセルに対して、インデックスを使用して値を設定する

2022-03-15 14:16:46

質問

PandasのDataFrameを作成しました。

df = DataFrame(index=['A','B','C'], columns=['x','y'])

そして、このようになりました。

    x y
A NaN NaN
B NaN NaN
C NaN NaN

次に、特定のセル、例えば行に値を割り当てたいと思います。 C と列 x . このような結果になると予想されます。

    x y
A NaN NaN
B NaN NaN
C 10 NaN

このコードで

df.xs('C')['x'] = 10

しかし df は変わっていない。データフレームには、またしても NaN s.

何かご意見はありますか?

解決方法は?

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 そのものです。

警告 : ある操作がコピーとビューのどちらを返すかを予測するのが難しい場合があります。このため docs では、"chained indexing" を使用した代入を避けることを推奨しています。 .


つまり、推奨される代替案は

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