このガイドでは、Pandas DataFrame で IF 条件を適用する 5 つの方法について説明します。

具体的には、次の場合に IF 条件を適用する方法について説明します。

  1. 数字のセット
  2. 数値とラムダの集合
  3. 文字列
  4. 文字列とラムダ
  5. 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 で得られる結果は次のとおりです。

Pandas DataFrame の IF 条件 1

(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 に一致する結果は次のとおりです。

Pandas DataFrame の IF 条件 2

(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 コードを実行すると、次のようになります。

Pandas DataFrame の IF 条件 3

(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 からの出力は次のとおりです。

Pandas DataFrame の IF 条件 4

(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 コードを実行すると、次の結果が得られます。

Pandas DataFrame の IF 条件 5

既存の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」になった前後の結果です。

前に:

Pandas DataFrame の IF 条件 6

後:

Pandas DataFrame の IF 条件 7

別のインスタンスでは、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 条件 8

後:

Pandas DataFrame の IF 条件 9

結論

Pandas DataFrame で IF 条件を適用する方法を確認しました。Python では、このような条件を適用する方法が複数あります。Lambda を使っても、Pandas だけでも同じ結果が得られます。

結局のところ、自分のニーズに最も適した方法で作業することが重要になります。