Pandas でのデータフィルタリング

PandasBeginner
オンラインで実践に進む

はじめに

Pandas でのデータフィルタリングの実験へようこそ!データフィルタリングは、データ分析において最も一般的で不可欠なタスクの一つです。特定の条件を満たすデータのサブセットを選択できるため、分析に最も関連性の高い情報に焦点を当てることができます。

Pandas は、データ操作と分析のための強力な Python ライブラリです。そのコアデータ構造である DataFrame は、行と列を持つ 2 次元のデータテーブルです。この実験では、Pandas DataFrame から行をフィルタリングするためのいくつかの基本的なテクニックを学びます。以下の内容を扱います。

  • 単一のブール条件によるフィルタリング。
  • 論理演算子を使用した複数条件の組み合わせ。
  • 複数の値との一致にisin()メソッドを使用する。
  • 欠損データ(NaN)を持つ行の削除。
  • フィルタリングされたデータの結果のカウント。

この実験の終わりには、Pandas プロジェクトでデータを選択および分離するための確固たる基盤が得られるでしょう。

ブール条件で行をフィルタリングする

このステップでは、最も基本的なフィルタリング手法であるブールインデックス(boolean indexing)を学びます。この方法では、TrueFalseの値を持つ Pandas Series を返すブール条件を作成します。この Series を DataFrame に渡すと、値がTrueである行のみが返されます。

まず、30 歳を超えるすべての従業員を見つけるために、DataFrame をフィルタリングしてみましょう。

最初に、左側のエディタでmain.pyファイルを開きます。ファイルにはサンプル DataFrame が事前に入力されています。

次に、main.pyの下部にある既存のprintステートメントを以下のコードに置き換えます。このコードは、ブール条件df['Age'] > 30を作成し、それを使用して DataFrame をフィルタリングします。

## Filter for employees older than 30
older_than_30 = df[df['Age'] > 30]

print("Employees older than 30:")
print(older_than_30)

これで、完全なmain.pyファイルは以下のようになります。

import pandas as pd
import numpy as np

## Create a sample DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'],
    'Department': ['HR', 'HR', 'Sales', 'IT', 'IT', 'Finance'],
    'Age': [25, 45, 38, 52, 29, 33],
    'Salary': [50000, 80000, 75000, 95000, 62000, np.nan]
}

df = pd.DataFrame(data)

## Filter for employees older than 30
older_than_30 = df[df['Age'] > 30]

print("Employees older than 30:")
print(older_than_30)

それでは、スクリプトを実行しましょう。ターミナルを開き、次のコマンドを実行します。

python3 main.py

以下のような出力が表示され、年齢が 30 歳を超える従業員のみがリストされます。

Employees older than 30:
      Name Department  Age   Salary
1      Bob         HR   45  80000.0
2  Charlie      Sales   38  75000.0
3    David         IT   52  95000.0
5    Frank    Finance   33      NaN

&演算子を使用したフィルタの組み合わせ

このステップでは、複数の条件を組み合わせて、より複雑なフィルタリングを実行します。ブール条件は論理演算子を使用して組み合わせることができます。最も一般的なのは、AND の場合は&、OR の場合は|です。

重要な構文規則として、Python の演算子の優先順位により、各条件は括弧()で囲む必要があります。

DataFrame をフィルタリングして、「IT」部門に所属しかつ30 歳を超える従業員を見つけましょう。

main.pyファイルを変更します。前のステップのフィルタリングコードを、以下の新しいコードに置き換えてください。

## Filter for employees in IT and older than 30
it_and_older = df[(df['Department'] == 'IT') & (df['Age'] > 30)]

print("IT employees older than 30:")
print(it_and_older)

各条件、df['Department'] == 'IT'df['Age'] > 30がそれぞれ独自の括弧で囲まれていることに注意してください。

main.pyファイルを保存し、ターミナルから実行します。

python3 main.py

出力には、両方の条件を満たす従業員のみが表示されます。このデータセットでは、David のみがこの基準に一致します。

IT employees older than 30:
    Name Department  Age   Salary
3  David         IT   52  95000.0

値の一致に isin メソッドを使用する

このステップでは、列の値が複数の可能な値のいずれかである行をフィルタリングする方法を学びます。複数の|(OR)条件を使用することもできますが、より効率的で読みやすい方法はisin()メソッドを使用することです。このメソッドは値のリストを受け取り、列の値がそのリストに含まれている各行に対してTrueを返します。

「HR」または「Finance」部門で働くすべての従業員を見つけましょう。

main.pyファイルのフィルタリングロジックを以下のコードに更新してください。

## Filter for employees in HR or Finance departments
hr_or_finance = df[df['Department'].isin(['HR', 'Finance'])]

print("Employees in HR or Finance:")
print(hr_or_finance)

ここでは、isin(['HR', 'Finance'])Department列のどの行の値が「HR」または「Finance」であるかを確認します。

ファイルを保存し、ターミナルでスクリプトを実行します。

python3 main.py

出力には、指定された部門のすべての従業員が表示されます。

Employees in HR or Finance:
    Name Department  Age   Salary
0  Alice         HR   25  50000.0
1    Bob         HR   45  80000.0
5  Frank    Finance   33      NaN

notnull を使用して NaN を除外する

このステップでは、欠損データの処理方法について説明します。Pandas では、欠損値は通常NaN(Not a Number)で表されます。計算を実行する前に、これらの欠損値を含む行をフィルタリングする必要があることがよくあります。

notnull()メソッドは、欠損値でない値に対してTrueを、欠損値(NaN)に対してFalseを返すブール値の Series を返します。これを使用して、特定の列のNaNを含む行を簡単に削除できます。

給与情報がある従業員のみを表示するように DataFrame をフィルタリングしましょう。

main.pyファイルを変更して、Salary列でnotnull()メソッドを使用します。

## Filter out rows with missing Salary
valid_salary = df[df['Salary'].notnull()]

print("Employees with valid salary information:")
print(valid_salary)

このコードは、Salary列にNaNが含まれていないすべての行を選択します。

ファイルを保存し、ターミナルからスクリプトを実行します。

python3 main.py

出力でわかるように、給与がNaNだった Frank は結果から除外されています。

Employees with valid salary information:
      Name Department  Age   Salary
0    Alice         HR   25  50000.0
1      Bob         HR   45  80000.0
2  Charlie      Sales   38  75000.0
3    David         IT   52  95000.0
4      Eve         IT   29  62000.0

len 関数を使用してフィルタリングされた行数をカウントする

この最終ステップでは、フィルタリングされた DataFrame の行数をカウントする方法を学びます。フィルタを適用した後、基準に一致した行がいくつあるかを知る必要があることがよくあります。これを行う簡単な方法は、Python の組み込み関数であるlen()を使用することです。この関数は DataFrame の行数を返します。

「IT」部門のすべての従業員をフィルタリングし、それらをカウントしましょう。

main.pyファイルを以下のコードに更新してください。まず DataFrame をフィルタリングし、次に結果のフィルタリングされた DataFrame をlen()関数に渡します。

## Filter for employees in the IT department
it_employees = df[df['Department'] == 'IT']

## Count the number of IT employees
num_it_employees = len(it_employees)

print(f"Number of employees in IT: {num_it_employees}")

このコードは、まず IT 部門の行のみを含む新しい DataFrame it_employees を作成します。次に、この新しい DataFrame の長さを計算し、結果を含むフォーマットされた文字列を出力します。

ファイルを保存してスクリプトを実行します。

python3 main.py

出力は、カウントを示す 1 行になります。

Number of employees in IT: 2

まとめ

Pandas でのデータフィルタリングの実験、お疲れ様でした!

この実験では、Pandas DataFrame からデータのサブセットを選択するための基本的なテクニックを学び、実践しました。以下の内容をカバーしました。

  • ブールインデックス(Boolean Indexing): 単一の条件に基づいてデータをフィルタリングする(例:df[df['Age'] > 30])。
  • フィルタの組み合わせ: &(AND)演算子を使用して複数の条件を同時に適用する。各条件を括弧で囲むことを忘れないでください。
  • isin()を使用した値の一致: 指定されたリスト内のいずれかの値と列の値が一致する行を効率的にフィルタリングする。
  • 欠損データの処理: notnull()メソッドを使用して、NaN値を含む行を削除する。
  • フィルタリングされた行のカウント: len()関数を使用して、フィルタリングされた DataFrame の行数を取得する。

これらのフィルタリングスキルは、ほぼすべてのデータ分析タスクの基本となります。これらを習得することで、データセットを効果的に探索し、さらなる分析や可視化のために準備できるようになります。これらのテクニックを練習し続けて、Pandas の習熟度を高めてください。