PythonのPandasで条件に応じて値を置換する方法について

Python,イメージ

AI実装検定のご案内

PythonのPandasで「条件に応じて値を置換する方法」は、データクリーニングや前処理において非常に重要です。


この操作は、DataFrameSeries の特定の条件に基づいて値を変更することを指し、複数の方法で実現できます。

目次

基本:条件付きの値置換(loc を使う)

df.loc[条件, 列名] = 値 という形で、特定の条件に合う値を一括で置換します。

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'age': [25, 17, 35, 16]
})

# 年齢が18未満の人の名前を「Minor」に置き換える
df.loc[df['age'] < 18, 'name'] = 'Minor'

print(df)

ポイント

  • 条件には比較演算子(<, ==, !=, &, | など)が使える。
  • 複数条件は &| を使い、() で囲むのが鉄則です。

apply()lambdaで柔軟に置換

条件がもっと複雑な場合、apply()lambda関数を用いることで柔軟に対応できます。

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'age': [25, 17, 35, 16]
})

# 年齢に応じてカテゴリを追加
df['category'] = df['age'].apply(lambda x: 'Child' if x < 18 else 'Adult')

print(df)

apply() は行・列単位の関数適用に非常に強力で、axis=1を指定すれば行全体も見られます。

replace()で直接値を置換

replace()は「特定の値→別の値」の置換に向いています。

条件というよりも「値のマッチ」に対して適用されます。

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David']
})

# 単一の値を置換
df['name'] = df['name'].replace('Alice', 'Alicia')

# 複数の値をまとめて置換
df['name'] = df['name'].replace({'Bob': 'Robert', 'Charlie': 'Charles'})

print(df)

np.where()で条件分岐(NumPy)

np.where(条件, 条件がTrueのときの値, Falseのときの値) で新しい列を効率的に作ることも可能。

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'age': [25, 17, 35, 16]
})

# 年齢に応じてステータスを追加
df['status'] = np.where(df['age'] >= 18, 'Adult', 'Minor')

print(df)
  • 条件ベースで2値を返すのに最適。
  • 複雑なロジックがなければ apply() より高速。

mask()where()の使い分け

  • where() は「条件がTrueのときはそのまま、Falseのときに値を置換」
  • mask() は「条件がTrueのときに値を置換、Falseのときはそのまま」
import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'age': [25, 17, 35, 16]
})

# mask: 条件がTrueのときに値を置換(ここではNaN)
masked_df = df.copy()
masked_df['age'] = masked_df['age'].mask(masked_df['age'] < 18)

# where: 条件がFalseのときに値を置換(ここではNaN)
where_df = df.copy()
where_df['age'] = where_df['age'].where(where_df['age'] < 18)

print("== mask ==")
print(masked_df)
print("== where ==")
print(where_df)

NaNを入れる場合によく使いますが、他の値も指定できます。

複数条件での置換

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'Elder'],
    'age': [25, 17, 35, 70]
})

# カスタム関数でラベルを付ける
def label_age(age):
    if age < 18:
        return 'Child'
    elif age < 65:
        return 'Adult'
    else:
        return 'Senior'

df['label'] = df['age'].apply(label_age)

print(df)

補足:条件が列をまたぐとき

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'age': [25, 17, 35, 16],
    'gender': ['F', 'M', 'M', 'M']
})

# 複数の条件を指定して値を置換
df.loc[(df['age'] < 18) & (df['gender'] == 'M'), 'name'] = 'Minor Boy'

print(df)

まとめ

方法向いている用途柔軟性処理速度
loc条件に合う値を直接置換高い普通
apply + lambda複雑なロジックで値を変更非常に高い遅め
replace特定の値だけを別の値に変更高速
np.whereTrue/False による2値の置換非常に速い
mask / where条件付きでNaNや他の値に置換普通
cut / qcut数値をカテゴリに分割(ビニング)高い普通

以上、PythonのPandasで条件に応じて値を置換する方法についてでした。

最後までお読みいただき、ありがとうございました。

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