24_Pandas.DataFrame,Series要素値の置換(replace)


24_Pandas.DataFrame,Series要素値の置換(replace)
pandasを置き換えるDataFrame,pandas.Series要素の値は、replace()メソッドを使用します.
ここで、以下に説明する.
  • 置換要素
  • 複数の異なる要素を一度に置換
  • 辞書で
  • を指定
  • リストに
  • を指定する
  • 注意点
  • 指定対象列により置換
  • .
  • を正規表現で置き換える.
  • 欠落値NaN
  • を置換
  • 変更元の項目
  • 以下のデータを例にとります.一部の要素の値は説明のために変更されました.
    import pandas as pd
    
    df = pd.read_csv('./data/24/sample_pandas_normal.csv')
    df.iloc[1, 3] = 24
    print(df)
    #       name  age state  point
    # 0    Alice   24    NY     64
    # 1      Bob   42    CA     24
    # 2  Charlie   18    CA     70
    # 3     Dave   68    TX     70
    # 4    Ellen   24    CA     88
    # 5    Frank   30    NY     57
    

    この例はpandasである.DataFrame、しかしpandas.Seriesは同じです.
    要素の置換
    最初のパラメータに元の要素の値を指定し、2番目のパラメータに置換後の値を指定します.
    print(df.replace('CA', 'California'))
    #       name  age       state  point
    # 0    Alice   24          NY     64
    # 1      Bob   42  California     24
    # 2  Charlie   18  California     70
    # 3     Dave   68          TX     70
    # 4    Ellen   24  California     88
    # 5    Frank   30          NY     57
    

    すべての列要素が含まれます.特定のカラムの値のみを置換する場合は、以下を参照してください.
    print(df.replace(24, 100))
    #       name  age state  point
    # 0    Alice  100    NY     64
    # 1      Bob   42    CA    100
    # 2  Charlie   18    CA     70
    # 3     Dave   68    TX     70
    # 4    Ellen  100    CA     88
    # 5    Frank   30    NY     57
    

    デフォルトでは、置換要素を持つ新しいDataFrameが返されますが、パラメータinplace=Trueの場合、元のDataFrameが変更されます.最後に、例を紹介します.
    複数の異なる要素を一度に置換
    複数の異なる要素を一度に置き換える場合は、辞書またはリストを使用します.
    辞書での指定
    最初のパラメータに{元の値:置換後の値}を指定する辞書.
    print(df.replace({'CA': 'California', 24: 100}))
    #       name  age       state  point
    # 0    Alice  100          NY     64
    # 1      Bob   42  California    100
    # 2  Charlie   18  California     70
    # 3     Dave   68          TX     70
    # 4    Ellen  100  California     88
    # 5    Frank   30          NY     57
    

    リストでの指定
    最初のパラメータに元の値のリストを指定し、2番目のパラメータに置換値のリストを指定します.リストのサイズ(要素数)が一致しない場合、エラーが発生します.
    print(df.replace(['CA', 24], ['California', 100]))
    #       name  age       state  point
    # 0    Alice  100          NY     64
    # 1      Bob   42  California    100
    # 2  Charlie   18  California     70
    # 3     Dave   68          TX     70
    # 4    Ellen  100  California     88
    # 5    Frank   30          NY     57
    
    # print(df.replace(['CA', 24, 'NY'], ['California', 100]))
    # ValueError: Replacement lists must match in length. Expecting 3 got 2 
    

    スカラー値を2番目のパラメータとして指定すると、すべての要素がその値に置き換えられます.
    print(df.replace(['CA', 24], 'XXX'))
    #       name  age state point
    # 0    Alice  XXX    NY    64
    # 1      Bob   42   XXX   XXX
    # 2  Charlie   18   XXX    70
    # 3     Dave   68    TX    70
    # 4    Ellen  XXX   XXX    88
    # 5    Frank   30    NY    57
    

    注意点
    複数の置換ペア間の元の値と置換値が同じかどうかに注意してください.値は順番に置換されるため、置換された値はさらに置換されます.結果は順序に依存します.
    辞書の例.
    print(df.replace({'CA': 'NY', 'NY': 'XXX'}))
    #       name  age state  point
    # 0    Alice   24   XXX     64
    # 1      Bob   42   XXX     24
    # 2  Charlie   18   XXX     70
    # 3     Dave   68    TX     70
    # 4    Ellen   24   XXX     88
    # 5    Frank   30   XXX     57
    
    print(df.replace({'NY': 'XXX', 'CA': 'NY'}))
    #       name  age state  point
    # 0    Alice   24   XXX     64
    # 1      Bob   42    NY     24
    # 2  Charlie   18    NY     70
    # 3     Dave   68    TX     70
    # 4    Ellen   24    NY     88
    # 5    Frank   30   XXX     57
    

    辞書の順序はPython 3.7以降は保持されているが、以前のバージョンでは定義されていない.必ずしも上記の結果のように見えるわけではありません.順序を明確に指定する場合は、replace()を繰り返し呼び出します.
    print(df.replace({'NY': 'XXX'}).replace({'CA': 'NY'}))
    #       name  age state  point
    # 0    Alice   24   XXX     64
    # 1      Bob   42    NY     24
    # 2  Charlie   18    NY     70
    # 3     Dave   68    TX     70
    # 4    Ellen   24    NY     88
    # 5    Frank   30   XXX     57
    

    リストでは、最初の要素が最初に置き換えられます.順序が重要な場合は、辞書を使用するよりもリストを使用するほうが簡単です.
    print(df.replace(['CA', 'NY'], ['NY', 'XXX']))
    #       name  age state  point
    # 0    Alice   24   XXX     64
    # 1      Bob   42   XXX     24
    # 2  Charlie   18   XXX     70
    # 3     Dave   68    TX     70
    # 4    Ellen   24   XXX     88
    # 5    Frank   30   XXX     57
    
    print(df.replace(['NY', 'CA'], ['XXX', 'NY']))
    #       name  age state  point
    # 0    Alice   24   XXX     64
    # 1      Bob   42    NY     24
    # 2  Charlie   18    NY     70
    # 3     Dave   68    TX     70
    # 4    Ellen   24    NY     88
    # 5    Frank   30   XXX     57
    

    指定したターゲット列で置換
    {カラム名:{元の値:置換後の値}}の辞書を最初のパラメータとして指定すると、ターゲットカラムの要素のみが置換されます.辞書要素の数を増やすことで、複数のカラムと複数の値を一度に置き換えることができます.
    print(df.replace({'age': {24: 100}}))
    #       name  age state  point
    # 0    Alice  100    NY     64
    # 1      Bob   42    CA     24
    # 2  Charlie   18    CA     70
    # 3     Dave   68    TX     70
    # 4    Ellen  100    CA     88
    # 5    Frank   30    NY     57
    
    print(df.replace({'age': {24: 100, 18: 0}, 'point': {24: 50}}))
    #       name  age state  point
    # 0    Alice  100    NY     64
    # 1      Bob   42    CA     50
    # 2  Charlie    0    CA     70
    # 3     Dave   68    TX     70
    # 4    Ellen  100    CA     88
    # 5    Frank   30    NY     57
    

    リストに元の値と置換後の値を指定できません.
    # print(df.replace({'age': [[24, 18], [100, 0]], 'point': {24: 50}}))
    # TypeError: If a nested mapping is passed, all values of the top level mapping must be mappings
    

    すべての値を同じ値で置換する場合は、最初のパラメータに{column name:original value}辞書を指定し、置換後の2番目のパラメータにスカラー値で値を指定します.最初のパラメータの元の値をリストとして指定できます.
    print(df.replace({'age': 24, 'point': 70}, 100))
    #       name  age state  point
    # 0    Alice  100    NY     64
    # 1      Bob   42    CA     24
    # 2  Charlie   18    CA    100
    # 3     Dave   68    TX    100
    # 4    Ellen  100    CA     88
    # 5    Frank   30    NY     57
    
    print(df.replace({'age': [24, 18], 'point': 70}, 100))
    #       name  age state  point
    # 0    Alice  100    NY     64
    # 1      Bob   42    CA     24
    # 2  Charlie  100    CA    100
    # 3     Dave   68    TX    100
    # 4    Ellen  100    CA     88
    # 5    Frank   30    NY     57
    

    正規表現で置換
    正規表現は、パラメータregex=Trueとともに使用できます.
    たとえば、既定では、要素の値が完全に一致している場合にのみ、要素の値が置き換えられます.したがって、部分的に一致しても、それらは置き換えられません.
    print(df.replace('li', 'LI'))
    #       name  age state  point
    # 0    Alice   24    NY     64
    # 1      Bob   42    CA     24
    # 2  Charlie   18    CA     70
    # 3     Dave   68    TX     70
    # 4    Ellen   24    CA     88
    # 5    Frank   30    NY     57
    

    たとえば、要素の文字列の一部を置換する場合は、パラメータregex=Trueを使用して正規表現に設定します.
    ()に含まれる部分は、置換後にグループとして順番に使用できます.たとえば、1および2です.
    print(df.replace('(.*)li(.*)', r'\1LI\2', regex=True))
    #       name  age state  point
    # 0    ALIce   24    NY     64
    # 1      Bob   42    CA     24
    # 2  CharLIe   18    CA     70
    # 3     Dave   68    TX     70
    # 4    Ellen   24    CA     88
    # 5    Frank   30    NY     57
    

    regex=Trueの場合は、正規表現モードを最初のパラメータとして、置換文字列を2番目のパラメータとして指定します.
    特定のカラム要素の文字列の一部を置き換える場合は、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     24
    # 2  CharLIe   18    CA     70
    # 3     Dave   68    TX     70
    # 4    Ellen   24    CA     88
    # 5    Frank   30    NY     57
    

    詳細は以下の記事を参照してください.
  • 13_Pandas文字列の置換やスペースの削除などの方法
  • 欠落した値NaNの置換
    欠落した値NaNを置換するためのfillna()という方法が提供される.
    replace()は使用できますが、fillna()は行または列に応じて異なる値を置き換えることができます.
    詳細は以下の記事を参照してください.
  • 05_Pandasは削除し、欠落した値NaN
  • を置換して抽出する.
    元のアイテムの変更
    デフォルトでは、置換要素を持つ新しいDataFrameが返されますが、パラメータinplace=Trueの場合、元のDataFrameが変更されます.
    df = pd.read_csv('./data/24/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