PythonのPandasで「条件に応じて値を置換する方法」は、データクリーニングや前処理において非常に重要です。
この操作は、DataFrame
や Series
の特定の条件に基づいて値を変更することを指し、複数の方法で実現できます。
目次
基本:条件付きの値置換(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.where | True/False による2値の置換 | 中 | 非常に速い |
mask / where | 条件付きでNaNや他の値に置換 | 中 | 普通 |
cut / qcut | 数値をカテゴリに分割(ビニング) | 高い | 普通 |
以上、PythonのPandasで条件に応じて値を置換する方法についてでした。
最後までお読みいただき、ありがとうございました。