【Pandas】特定の値を書き換える方法[Python]

  • URLをコピーしました!
目次

Pandas

前回、PythonのPandasで特定の行や列を削除する方法、そして特定の値をもつデータを削除する方法を紹介しました。

今回は同じくPandasの話題で特定の値を書き換える方法を紹介します。

使うデータは前回同様こんな感じで作ってみました。

import pandas as pd

data = [[i, i*2, i**2] for i in range(1, 6)]

df = pd.DataFrame(data, columns=["x", "y", "z"])

print(df)

実行結果
   x   y   z
0  1   2   1
1  2   4   4
2  3   6   9
3  4   8  16
4  5  10  25

それでは始めていきましょう。

特定の値を書き換える:replace

特定の値を書き換えるには「replace(書き換える値、書き換え後の値)」とします。

import pandas as pd

data = [[i, i*2, i**2] for i in range(1, 6)]

df = pd.DataFrame(data, columns=["x", "y", "z"])

df = df.replace(4, 10)

print(df)

実行結果
    x   y   z
0   1   2   1
1   2  10  10
2   3   6   9
3  10   8  16
4   5  10  25

複数の値を書き換える時は辞書形式で「replace({書き換え前の値1:書き換え後の値1, 書き換え前の値2:書き換え後の値2})」とします。

import pandas as pd

data = [[i, i*2, i**2] for i in range(1, 6)]

df = pd.DataFrame(data, columns=["x", "y", "z"])

df = df.replace({2:10, 4:15})

print(df)

実行結果
    x   y   z
0   1  10   1
1  10  15  15
2   3   6   9
3  15   8  16
4   5  10  25

もしくはリスト形式で「replace([書き換え前の値1, 書き換え前の値2], [書き換え後の値1, 書き換え後の値2])」でも複数の値を一度に書き換えることができます。

import pandas as pd

data = [[i, i*2, i**2] for i in range(1, 6)]

df = pd.DataFrame(data, columns=["x", "y", "z"])

df = df.replace([2, 4], [10, 15])

print(df)

実行結果
    x   y   z
0   1  10   1
1  10  15  15
2   3   6   9
3  15   8  16
4   5  10  25

この際、2つ目のリストを無くして、「replace([書き換え前の値1, 書き換え前の値2], 書き換え後の値)」とすると、複数の値を一つの値に書き換えることができます。

import pandas as pd

data = [[i, i*2, i**2] for i in range(1, 6)]

df = pd.DataFrame(data, columns=["x", "y", "z"])

df = df.replace([2, 4], 10)

print(df)

実行結果
    x   y   z
0   1  10   1
1  10  10  10
2   3   6   9
3  10   8  16
4   5  10  25

特定の列の特定の値を書き換える方法 その1

次に特定の列の特定の値を書き換える方法を紹介します。

書き換える前の特定の列の特定の値のデータのみ取得する必要があります。

その場合は「データフレーム.loc(条件, “列”)」とします。

import pandas as pd

data = [[i, i*2, i**2] for i in range(1, 6)]

df = pd.DataFrame(data, columns=["x", "y", "z"])

print(df.loc[df["z"] > 10, "z"])

実行結果
3    16
4    25
Name: z, dtype: int64

これで上の例では「z列」の10より大きい値だけ取得できました。

これを書き換える場合は「=」で値を繋げます。

import pandas as pd

data = [[i, i*2, i**2] for i in range(1, 6)]

df = pd.DataFrame(data, columns=["x", "y", "z"])

df.loc[df["z"] > 10, "z"] = 100

print(df)

実行結果
   x   y    z
0  1   2    1
1  2   4    4
2  3   6    9
3  4   8  100
4  5  10  100

ちなみに最後の「列」を無くすと、条件に合った行のデータ全てが書き換えられてしまうので注意です。

import pandas as pd

data = [[i, i*2, i**2] for i in range(1, 6)]

df = pd.DataFrame(data, columns=["x", "y", "z"])

df.loc[df["z"] > 10] = 100

print(df)

実行結果
     x    y    z
0    1    2    1
1    2    4    4
2    3    6    9
3  100  100  100
4  100  100  100

特定の列の特定の値を書き換える方法 その2

特定の列の特定の値を書き換えるもう一つの方法として「where」を使う方法があります。

「データフレーム.where(条件)」で条件に合う行のデータは残り、合わない行は「NaN」となります。

import pandas as pd

data = [[i, i*2, i**2] for i in range(1, 6)]

df = pd.DataFrame(data, columns=["x", "y", "z"])

print(df.where(df["z"] > 10))

実行結果
     x     y     z
0  NaN   NaN   NaN
1  NaN   NaN   NaN
2  NaN   NaN   NaN
3  4.0   8.0  16.0
4  5.0  10.0  25.0

さらに「データフレーム.where(条件, 値)」とすると、条件に合わなかった(先ほどの例でNaNとなった)データが指定した値に書き換えられます。

import pandas as pd

data = [[i, i*2, i**2] for i in range(1, 6)]

df = pd.DataFrame(data, columns=["x", "y", "z"])

df = df.where(df["z"] > 10, 100)

print(df)

実行結果
     x    y    z
0  100  100  100
1  100  100  100
2  100  100  100
3    4    8   16
4    5   10   25

そして特定の列のみ書き換える場合は「データフレーム「”列”]」を「=」で繋げます。

import pandas as pd

data = [[i, i*2, i**2] for i in range(1, 6)]

df = pd.DataFrame(data, columns=["x", "y", "z"])

df["z"] = df["z"].where(df["z"] > 10, 100)

print(df)

実行結果
   x   y    z
0  1   2  100
1  2   4  100
2  3   6  100
3  4   8   16
4  5  10   25

ただしwhereの場合は条件に合わなかったところを書き換えるので、「特定の列の特定の値を書き換える方法 その1」と出力を合わせたい場合は条件を逆にします。

import pandas as pd

data = [[i, i*2, i**2] for i in range(1, 6)]

df = pd.DataFrame(data, columns=["x", "y", "z"])

df["z"] = df["z"].where(df["z"] <= 10, 100)

print(df)

実行結果
   x   y    z
0  1   2    1
1  2   4    4
2  3   6    9
3  4   8  100
4  5  10  100

複数の列の特定の値を書き換える

これまで見てきた2つの方法はあくまでも「特定の列」の特定の値を書き換える方法でした。

実際には複数の列の特定の値を書き換えたいという場面も出てくるでしょう。

その場合はfor文を使って一つずつ値を取り出し、表見と比較し、書き換えを行います。

ということでこんな感じです。

import pandas as pd

data = [[i, i*2, i**2] for i in range(1, 6)]

df = pd.DataFrame(data, columns=["x", "y", "z"])

for i in df.columns:
    for j in df.index:
        if df[i][j] >= 10:
            df[i][j] = 100

print(df)

実行結果
   x    y    z
0  1    2    1
1  2    4    4
2  3    6    9
3  4    8  100
4  5  100  100

これで複数の列の特定の値を書き換えることができました。

次回は

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次