【Python】Pandasで条件に基づいてデータフレームに代入する方法

はじめに

PandasはPythonのデータ解析ライブラリであり、データフレームという表形式のデータを扱うことができます。データフレームには様々な値が格納されており、これらの値に基づいて別の値を代入することがあります。この記事では、Pandasを用いて条件に基づいてデータフレームに代入する方法について解説します。

条件に基づく代入の意義と利用シーン

条件に基づく代入とは、データフレームに格納された値に対して、ある条件を満たす場合に別の値を代入することを指します。これにより、データフレームの値を効率的かつ正確に更新することができます。

例えば、以下のような場合に条件に基づく代入が役立ちます。

  • 欠損値を特定の値で埋める
  • 異常値を特定の値に修正する
  • 特定の範囲にある値を別の値に変換する

単一条件でのデータフレームへの代入方法

単一条件でのデータフレームへの代入方法として、Pandasのloc関数を使用します。loc関数は、行と列のラベルを指定して、その要素を取得または変更するために使用されます。

以下は、ある条件を満たす場合に、データフレームの特定の列にある値を変更する例です。

import pandas as pd
# データフレームの作成
df = pd.DataFrame({
  'name': ['Alice', 'Bob', 'Charlie', 'Dave'],
  'age': [25, 30, 35, 40],
  'gender': ['F', 'M', 'M', 'M']
})
# 条件に基づく代入
df.loc[df['name'] == 'Alice', 'age'] = 26
print(df)

上記のコードでは、name列が”Alice”である場合にage列を26に変更しています。結果は以下の通りです。

name age gender
Alice 26 F
Bob 30 M
Charlie 35 M
Dave 40 M

また、以下はgender列が”F”である場合にname列を”Alex”に変更する例です。

# 条件に基づく代入
df.loc[df['gender'] == 'F', 'name'] = 'Alex'
print(df)

上記のコードでは、gender列が”F”である場合にname列を”Alex”に変更しています。結果は以下の通りです。

name age gender
Alex 26 F
Bob 30 M
Charlie 35 M
Dave 40 M

複数条件を組み合わせた代入方法

複数条件を組み合わせた場合は、条件を()で囲んで&や|を用いて論理和や論理積を表します。

以下は、name列が”Bob”かつgender列が”M”である場合にage列を31に変更する例です。

# 条件に基づく代入
df.loc[(df['name'] == 'Bob') & (df['gender'] == 'M'), 'age'] = 31
print(df)

上記のコードでは、name列が”Bob”かつgender列が”M”である場合にage列を31に変更しています。結果は以下の通りです。

name age gender
Alex 26 F
Bob 31 M
Charlie 35 M
Dave 40 M

np.whereを用いた条件付き代入の実践

np.whereを用いた条件付き代入は、Pandasのloc関数を使用するよりも簡潔に書くことができます。np.whereは、条件を満たす場合と満たさない場合で別々の値を代入することができます。

以下は、gender列が”M”である場合に”Male”を、それ以外の場合に”Female”を代入する例です。

import numpy as np
# 条件に基づく代入
df['gender'] = np.where(df['gender'] == 'M', 'Male', 'Female')
print(df)

上記のコードでは、gender列が”M”である場合に”Male”を、それ以外の場合に”Female”を代入しています。結果は以下の通りです。

name age gender
Alex 26 Female
Bob 31 Male
Charlie 35 Male
Dave 40 Male

apply関数を使った条件付き代入の応用

apply関数を使用すると、複雑な条件に基づいて値を代入することができます。apply関数は、各行または各列に対して指定された関数を適用することができます。

以下は、age列が30未満の場合に、gender列を’Male’に変更する例です。

# 条件に基づく代入関数
def change_gender(row):
    if row['age'] < 30:
        return 'Male'
    else:
        return row['gender']
# apply関数を使用した条件に基づく代入
df['gender'] = df.apply(change_gender, axis=1)
print(df)

上記のコードでは、age列が30未満の場合に、gender列を’Male’に変更しています。結果は以下の通りです。

name age gender
Alex 26 Male
Bob 31 M
Charlie 35 M
Dave 40 M

上記のコードでは、apply関数により、各行に対してchange_gender関数を適用し、条件に基づく代入を行っています。

まとめ

Pandasを用いた条件に基づく代入について解説しました。単一条件でのデータフレームへの代入方法、複数条件を組み合わせた代入方法、np.whereを用いた条件付き代入の実践、apply関数を使った条件付き代入の応用について説明しました。これらの方法を活用して、効率的にデータフレームを更新することができます。

最後に、今回の記事がPandasを使用する際に役立つ情報となることを願っています。