note.nkmk.me

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

Date: 2018-01-22 / tags: Python, pandas

pandas.DataFrame, pandas.Seriesの要素の値を置換するには、replace()メソッドを使う。

複数の異なる要素を一括で置き換えたり正規表現を使ったりすることもできる。

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

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ファイルはコチラ。

例は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
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事