pandas.DataFrame, Seriesの要素の値を置換するreplace

pandas.DataFrame, pandas.Seriesの要素の値を置換するには、replace()メソッドを使います。 複数の異なる要素を一括で置き換えたり正規表現を使ったりすることもできます。

pandas.DataFrame.replace — pandas 0.22.0 documentation

例として以下のデータを使用します。

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

サンプルのcsvファイルはコチラ。

sample_pandas_normal.csv

例はpandas.DataFrameだが、pandas.Seriesでも同様。 なお、pandas.Seriesに対してはmap()メソッドで置換することも可能。正規表現は使えないが、すべての要素を別の値に置換するのであればreplace()よりmap()のほうが高速になる場合が多い。

また、値を指定して置換するのではなく、条件に応じて値を変更する方法は以下の記事を参照。

要素を置換

print(df.replace('CA', 'California'))
#       name  age       state  point
# 0    Alice   24          NY     64
# 1      Bob   42  California     92
# 2  Charlie   18  California     70
# 3     Dave   68          TX     70
# 4    Ellen   24  California     88
# 5    Frank   30          NY     57

複数の異なる要素を一括で置換

複数の異なる要素を一括で置き換えたい場合は、辞書型で指定します。

print(df.replace({'CA': 'California', 'NY': 'New York'}))
#       name  age       state  point
# 0    Alice   24    New York     64
# 1      Bob   42  California     92
# 2  Charlie   18  California     70
# 3     Dave   68          TX     70
# 4    Ellen   24  California     88
# 5    Frank   30    New York     57

正規表現で置換

引数regex=Trueとすると、正規表現を使うことができます。 例えば、デフォルトでは要素の値が完全に一致した場合のみ置換されるので、一部だけ一致していても置換されない。

print(df.replace('li', 'LI'))
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

要素の文字列の一部を置換したい場合、引数regex=Trueとして、正規表現で設定します。

print(df.replace('(.*)li(.*)', r'\1LI\2', regex=True))
#       name  age state  point
# 0    ALIce   24    NY     64
# 1      Bob   42    CA     92
# 2  CharLIe   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

文字列メソッドstr.replace()を使う方法もあります。

df['name'] = df['name'].str.replace('li', 'LI')
print(df)
#       name  age state  point
# 0    ALIce   24    NY     64
# 1      Bob   42    CA     92
# 2  CharLIe   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

詳細は以下の記事参照。

欠損値NaNの置換

欠損値NaNの置換には、fillna()というメソッドが用意されています。 replace()を使っても可能だが、fillna()だと行や列によって異なる値に置き換えたりできます。 詳細は以下の記事参照。

元のオブジェクトを変更

デフォルトでは、要素を置換した新たなDataFrameが返されるが、引数inplace=Trueとすると、元のDataFrameが変更される。

df = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

df.replace('CA', 'California', inplace=True)
print(df)
#       name  age       state  point
# 0    Alice   24          NY     64
# 1      Bob   42  California     92
# 2  Charlie   18  California     70
# 3     Dave   68          TX     70
# 4    Ellen   24  California     88
# 5    Frank   30          NY     57

シェア

関連カテゴリー

Python pandas

pandasの表示設定変更(小数点以下桁数、有効数字、最大行数・列数など) pandasで中央値を取得するmedian pandasでcsvファイルの書き出し・追記(to_csv) pandas.DataFrameの行・列を指定して削除するdrop pandasで数値を丸める(四捨五入、偶数への丸め) pandasで条件に応じて値を代入(where, mask) Pythonでメソッドチェーンを改行して書く pandasのdescribeで各列の要約統計量(平均、標準偏差など)を取得 pandas.DataFrameのforループ処理(イテレーション) pandas.Seriesのmapメソッドで列の要素を置換 pandas.DataFrameから条件を満たす行名・列名の行・列を抽出(選択) pandasで行・列の差分・変化率を取得するdiff, pct_change pandasのcrosstabでクロス集計(カテゴリ毎の出現回数・頻度を算出) pandas.DataFrameを結合するmerge, join(列・インデックス基準) pandas.DataFrameの列をインデックス(行名)に割り当てるset_index

Last Updated: 6/26/2019, 10:34:03 PM