【Python】pandasで条件に基づいて新しい列を作成する方法

はじめに

Pythonのデータ分析ライブラリであるpandasは、データの整理や加工に便利な機能を提供しています。この記事では、pandasを使って条件に基づいて新しい列を作成する方法を解説します。

pandasを使った条件に基づく新しい列の作成の概要

pandasでは、条件に基づいて新しい列を作成するために、次の方法があります。

  • 単一条件を使って新しい列を作成する方法
  • 複数条件を組み合わせて新しい列を作成する方法
  • 条件に基づく値の代入方法(numpyのwhere関数を使用)
  • apply関数を用いた条件に基づく新しい列の作成

単一条件を使って新しい列を作成する方法

単一条件を使って新しい列を作成するには、pandasのDataFrameの条件式に対して真偽値の配列を代入することができます。具体的には、次のようなコードになります。

import pandas as pd
df = pd.DataFrame({
    '名前': ['田中', '鈴木', '佐藤', '山田', '中村'],
    '点数': [80, 90, 70, 60, 85]
})
# 点数が80以上の場合に'合格'、そうでない場合に'不合格'を示す列を追加する
df['合否'] = ['合格' if x >= 80 else '不合格' for x in df['点数']]
print(df)

このコードでは、DataFrameに名前と点数の2つの列があります。点数が80以上の場合に’合格’、そうでない場合に’不合格’を示す新しい列’合否’を追加しています。具体的には、リスト内包表記を使って、’点数’列の要素が80以上の場合に’合格’、そうでない場合に’不合格’を表す文字列を作成しています。そして、このリストをDataFrameの新しい列’合否’に代入しています。

実行結果は次のようになります。

  名前 点数 合否
0 田中 80   合格
1 鈴木 90   合格
2 佐藤 70   不合格
3 山田 60   不合格
4 中村 85   合格

このように、’合否’列が追加され、点数が80以上の場合に’合格’、そうでない場合に’不合格’が示されています。

複数条件を組み合わせて新しい列を作成する方法

複数の条件を組み合わせて新しい列を作成する場合には、pandasのDataFrameの条件式に対して複数の真偽値の配列を組み合わせることができます。具体的には、次のようなコードになります。

import pandas as pd
df = pd.DataFrame({
    '名前': ['田中', '鈴木', '佐藤', '山田', '中村'],
    '点数1': [80, 90, 70, 60, 85],
    '点数2': [70, 80, 60, 85, 75]
})

# 点数1が80以上かつ点数2が70以上の場合に'合格'、そうでない場合に'不合格'を示す列を追加する
df['合否'] = ['合格' if x and y else '不合格' for x, y in zip(df['点数1'] >= 80, df['点数2'] >= 70)]
print(df)

このコードでは、DataFrameに名前と2つの点数の列があります。点数1が80以上かつ点数2が70以上の場合に’合格’、そうでない場合に’不合格’を示す新しい列’合否’を追加しています。具体的には、zip関数を使って、’点数1’列の要素が80以上かつ’点数2’列の要素が70以上の場合にTrue、そうでない場合にFalseを表す真偽値のタプルを作成し、リスト内包表記を使って’合格’または’不合格’を表す文字列を作成しています。そして、このリストをDataFrameの新しい列’合否’に代入しています。

実行結果は次のようになります。

    名前  点数1  点数2  合否
0   田中   80   70  合格
1   鈴木   90   80  合格
2   佐藤   70   60  不合格
3   山田   60   85  不合格
4   中村   85   75  合格

このように、’合否’列が追加され、点数1が80以上かつ点数2が70以上の場合に’合格’、そうでない場合に’不合格’が示されています。

条件に基づく値の代入方法(numpyのwhere関数を使用)

条件に基づく値の代入には、numpyのwhere関数を使用することができます。where関数は、条件を満たす場合には指定した値、そうでない場合には元の値を持つ配列を返します。pandasでは、where関数を使って新しい列を作成することができます。具体的には、次のようなコードになります。

import pandas as pd
import numpy as np
df = pd.DataFrame({
    '名前': ['田中', '鈴木', '佐藤', '山田', '中村'],
    '点数1': [80, 90, 70, 60, 85],
    '点数2': [70, 80, 60, 85, 75]
})
# 点数1が80以上かつ点数2が70以上の場合に'合格'、そうでない場合に'不合格'を示す列を追加する
df['合否'] = np.where((df['点数1'] >= 80) & (df['点数2'] >= 70), '合格', '不合格')
print(df)

このコードでは、DataFrameに名前と2つの点数の列があります。点数1が80以上かつ点数2が70以上の場合に’合格’、そうでない場合に’不合格’を示す新しい列’合否’を追加しています。具体的には、np.where関数を使って、条件を満たす場合には’合格’、そうでない場合には’不合格’を返す配列を作成し、DataFrameの新しい列’合否’に代入しています。

実行結果は次のようになります。

    名前  点数1  点数2  合否
0   田中   80    70     合格
1   鈴木   90    80     合格
2   佐藤   70    60     不合格
3   山田   60    85     不合格
4   中村   85    75     合格

このように、’合否’列が追加され、点数1が80以上かつ点数2が70以上の場合に’合格’、そうでない場合に’不合格’が示されています。

apply関数を用いた条件に基づく新しい列の作成

apply関数を用いた条件に基づく新しい列の作成について解説します。apply関数は、pandasのdataframeに対して、関数を適用することができます。apply関数を使って、条件に基づいて新しい列を作成することができます。具体的には、次のようなコードになります。

import pandas as pd
df = pd.DataFrame({
    '名前': ['田中', '鈴木', '佐藤', '山田', '中村'],
    '点数1': [80, 90, 70, 60, 85],
    '点数2': [70, 80, 60, 85, 75]
})
# 点数1が80以上かつ点数2が70以上の場合に'合格'、そうでない場合に'不合格'を示す列を追加する
def decision(row):
    if (row['点数1'] >= 80) & (row['点数2'] >= 70):
        return '合格'
    else:
        return '不合格'
df['合否'] = df.apply(decision, axis=1)
print(df)

このコードでは、DataFrameに名前と2つの点数の列があります。apply関数を使って、’点数1’列が80以上かつ’点数2’列が70以上の場合に’合格’、そうでない場合に’不合格’を示す新しい列’合否’を追加しています。具体的には、decision関数を定義し、apply関数に渡しています。この関数では、’点数1’列が80以上かつ’点数2’列が70以上の場合に’合格’を、そうでない場合に’不合格’を返します。そして、apply関数によって、DataFrameの各行に対してdecision関数が呼び出され、その結果が新しい列’合否’に代入されます。

実行結果は次のようになります。

    名前  点数1  点数2  合否
0   田中   80    70     合格
1   鈴木   90    80     合格
2   佐藤   70    60     不合格
3   山田   60    85     不合格
4   中村   85    75     合格

このように、’合否’列が追加され、点数1が80以上かつ点数2が70以上の場合に’合格’、そうでない場合に’不合格’が示されています。

まとめ

この記事では、pandasを使って条件に基づいて新しい列を作成する方法について解説しました。単一条件や複数条件を組み合わせた条件式、numpyのwhere関数、apply関数を使った方法について説明しました。これらの方法を使えば、pandasを使って簡単に条件に基づく新しい列を作成することができます。