hatunina’s blog

メモと日記です

pandasのset_valueを.at[]に書き換える

大量のset_valueを書き換える雑務が降ってきたのでついでにまとめる

とりあえず例

import pandas as pd
import numpy as np
from numpy.random import seed

seed(1)

df = pd.DataFrame(np.random.randn(5, 4), columns=list('ABCD'))

print(df.head())

実行結果

          A         B         C         D
0  1.624345 -0.611756 -0.528172 -1.072969
1  0.865408 -2.301539  1.744812 -0.761207
2  0.319039 -0.249370  1.462108 -2.060141
3 -0.322417 -0.384054  1.133769 -1.099891
4 -0.172428 -0.877858  0.042214  0.582815

あ〜、2行目のB列のとこ書き換えてえな〜
set_value使うか〜

df.set_value(1, 'B', 100)
print(df.head())

実行結果

          A           B         C         D
0  1.624345   -0.611756 -0.528172 -1.072969
1  0.865408  100.000000  1.744812 -0.761207
2  0.319039   -0.249370  1.462108 -2.060141
3 -0.322417   -0.384054  1.133769 -1.099891
4 -0.172428   -0.877858  0.042214  0.582815

でけた!
でも、コンソールに赤文字でなんか出てる!

FutureWarning: set_value is deprecated and will be removed in a future release. Please use .at[] or .iat[] accessors instead df.set_value(1, 'B', 100)

なんじゃこりゃ〜

なんぞこれ

set_valueは将来のリリースで削除するから.at[].iat[]使ってね〜、とのことです。

ドキュメントにもこう書いてあります。

Put single value at passed column and index

Deprecated since version 0.21.0.

Please use .at[] or .iat[] accessors.

pandas.DataFrame.set_value — pandas 0.22.0 documentation

version 0.21.0.以降は非推奨ですって!

言う通りに書き換えます。

.at[]を使う

同じように使えます。 第1引数にindex(ラベル)、第2引数にcolumnを指定して書き換える内容を入れてあげます。

df.at[1, 'B'] = 100
print(df.head())

実行結果

          A           B         C         D
0  1.624345   -0.611756 -0.528172 -1.072969
1  0.865408  100.000000  1.744812 -0.761207
2  0.319039   -0.249370  1.462108 -2.060141
3 -0.322417   -0.384054  1.133769 -1.099891
4 -0.172428   -0.877858  0.042214  0.582815

こうすると値の取得もできます。

hoge = df.at[1, 'B']
print(hoge)

実行結果

100.0

.iat[]だと行番号と列番号で指定するそうです。


参考記事

note.nkmk.me