このガイドでは、Pandas DataFrame で IF 条件を適用する 5 つの方法について説明します。
具体的には、次の場合に IF 条件を適用する方法について説明します。
- 数字のセット
- 数値とラムダの集合
- 文字列
- 文字列とラムダ
- OR条件
Pandas DataFrame で IF 条件を適用する
(1) IF条件 – 数値の集合
Pythonで10個の数値(1から10)を含むデータフレームを作成したとします。そして、以下のIF条件を適用したいとします。
- 数値が4以下の場合は、「はい」の値を割り当てます
- それ以外の場合、数値が4より大きい場合は、「いいえ」の値を割り当てます。
これは、IF 条件を作成するために使用できる一般的な構造です。
df.loc[df['column name'] condition, 'new column name'] = 'value if condition is met'
この例では、pythonコードは次のようになります。
import pandas as pd
data = {'set_of_numbers': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}
df = pd.DataFrame(data)
df.loc[df['set_of_numbers'] <= 4, 'equal_or_lower_than_4?'] = 'Yes'
df.loc[df['set_of_numbers'] > 4, 'equal_or_lower_than_4?'] = 'No'
print(df)
Python で得られる結果は次のとおりです。

(2) IF条件 – 数値の集合とラムダ
ここで、条件が次のとおりである lambda を使用して、ケース 1 と同じ結果を得る方法を確認します。
- 数値が4以下の場合は、「Yes」の値を割り当てます
- それ以外の場合、数値が4より大きい場合は、「NO」の値を割り当てます。
Python で適用できる一般的な構造は次のとおりです。
df['new column name'] = df['column name'].apply(lambda x: 'value if condition is met' if x condition else 'value if condition is not met')
私たちの例:
import pandas as pd
data = {'set_of_numbers': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}
df = pd.DataFrame(data)
df['equal_or_lower_than_4?'] = df['set_of_numbers'].apply(lambda x: 'Yes' if x <= 4 else 'No')
print(df)
ケース 1 に一致する結果は次のとおりです。

(3) IF条件 – 文字列
ここで、Jon、Bill、Maria、Emma という 4 つの名前の文字列/テキストのみを含む DataFrame を作成しましょう。
条件は次のとおりです。
- そうでない場合、名前が「Bill」でない場合は、「Mismatch」の値を割り当てます。
- 名前が「Bill」と等しい場合は、「Match」の値を割り当てます
import pandas as pd
data = {'first_name': ['Jon', 'Bill', 'Maria', 'Emma']}
df = pd.DataFrame(data)
df.loc[df['first_name'] == 'Bill', 'name_match'] = 'Match'
df.loc[df['first_name'] != 'Bill', 'name_match'] = 'Mismatch'
print(df)
上記の Python コードを実行すると、次のようになります。

(4) IF条件 – 文字列とラムダ
lambda を使用すると、ケース 3 と同じ結果が得られます。
import pandas as pd
data = {'first_name': ['Jon', 'Bill', 'Maria', 'Emma']}
df = pd.DataFrame(data)
df['name_match'] = df['first_name'].apply(lambda x: 'Match' if x == 'Bill' else 'Mismatch')
print(df)
Python からの出力は次のとおりです。

(5) ORを含むIF条件
ここで、次の条件を適用してみましょう。
- 名前が「Bill」または「Emma」の場合は、「Match」の値を割り当てます
- そうでない場合、名前が「Bill」でも「Emma」でもない場合は、「Mismatch」の値を割り当てます。
import pandas as pd
data = {'first_name': ['Jon', 'Bill', 'Maria', 'Emma']}
df = pd.DataFrame(data)
df.loc[df['first_name'] == 'Bill', 'name_match'] = 'Match'
df.loc[df['first_name'] != 'Bill', 'name_match'] = 'Mismatch'
print(df)
Python コードを実行すると、次の結果が得られます。

既存のDataFrame列にIF条件を適用する
これまで、新しい列を作成して IF 条件を適用する方法を説明しました。
あるいは、既存の DataFrame 列に結果を保存することもできます。
例えば、12個の数字を持ち、最後の2つの数字が0であるデータフレームを作成したとします。
‘set_of_numbers’: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0]
次に、次の IF 条件を適用し、結果を既存の「set_of_numbers」列に保存します。
- 数値が0の場合は、値を999に変更します。
- 数値が5に等しい場合は、値を555に変更します。
import pandas as pd
data = {'set_of_numbers': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0]}
df = pd.DataFrame(data)
print(df)
df.loc[df['set_of_numbers'] == 0, 'set_of_numbers'] = 999
df.loc[df['set_of_numbers'] == 5, 'set_of_numbers'] = 555
print(df)
以下は、既存の「set_of_numbers」列の「5」が「555」に、0が「999」になった前後の結果です。
前に:

後:

別のインスタンスでは、NaN値を含むDataFrameがあるかもしれません。その場合、IF条件を適用して、これらの値をゼロに置き換えることができます。以下の例をご覧ください。
import pandas as pd
import numpy as np
data = {'set_of_numbers': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, np.nan, np.nan]}
df = pd.DataFrame(data)
print(df)
df.loc[df['set_of_numbers'].isnull(), 'set_of_numbers'] = 0
print(df)
前には NaN 値が表示され、後にはゼロ値が表示されます。
前に:

後:

結論
Pandas DataFrame で IF 条件を適用する方法を確認しました。Python では、このような条件を適用する方法が複数あります。Lambda を使っても、Pandas だけでも同じ結果が得られます。
結局のところ、自分のニーズに最も適した方法で作業することが重要になります。