1. ホーム
  2. スクリプト・コラム
  3. パイソン

Python 最適化データ前処理法 Pandasパイプ 詳細

2022-01-26 08:22:48

Pandasはデータ解析・処理に最も広く使われているライブラリの一つで、生データの前処理を行うための様々なメソッドを提供しています。

import numpy as np
import pandas as pd
df = pd.DataFrame({
   "id": [100, 100, 101, 102, 103, 104, 105, 106],
   "A": [1, 2, 3, 4, 5, 2, np.nan, 5],
   "B": [45, 56, 48, 47, 62, 112, 54, 49],
   "C": [1.2, 1.4, 1.1, 1.8, np.nan, 1.4, 1.6, 1.5]
})
df


上記データのNaNは欠損値、id列は重複値、B列の112は異常値と思われます。

これらは、実際のデータにおける典型的な問題点である。今説明した問題を処理するパイプラインを作成します。それぞれのタスクに対して、関数が必要です。そこでまず、パイプラインに配置する関数を作成します。パイプラインで使う関数は、データフレームを引数に取り、データフレームを返す必要があることに注意してください。

最初の関数は、欠損値を処理するためのものです

def fill_missing_values(df):
   for col in df.select_dtypes(include= ["int","float"]).columns:
      val = df[col].mean()
      df[col].fillna(val, inplace=True)
   return df


私は、数値列の欠損値を列の平均値に置き換えるのが好きですが、もちろん特定のシナリオに合わせて定義することができます。データフレームを引数に取り、データフレームを返すものであれば、パイプラインで動作します。

2つ目の関数は、重複する値を削除するためのものです

def drop_duplicates(df, column_name):
   df = df.drop_duplicates(subset=column_name)
   return df
 

Pandasの組み込みのdrop duplicates関数を呼び出し、与えられたカラムの中の重複する値を削除します。

最後の関数は、外れ値を除去するためのものです

def remove_outliers(df, column_list):
   for col in column_list:
      avg = df[col].mean()
      std = df[col].std()
      low = avg - 2 * std
      high = avg + 2 * std
      df = df[df[col].between(low, high, inclusive=True)]
   return df


この関数は、以下の処理を行います。

  • データフレームと列のリストが必要です。
  • リスト内の各列について、平均と標準偏差を計算する。
  • は標準偏差を計算し、下限平均を使用します。
  • 下限値と上限値で定義された範囲外の値を削除する

これまでの関数と同様に、外れ値を検出する方法を自分で選択することができます。

パイプラインの作成

これで、データの前処理を行うための3つの関数が揃いました。次は、これらの関数を用いてパイプラインを作成します。

df_processed = (df.pipe(fill_missing_values).pipe(drop_duplicates, "id").pipe(remove_outliers, ["A","B"] ))


このパイプラインは、指定された順序で関数を実行します。パイプラインには、関数名と一緒に引数を渡すことができます。

ここで一つ言及しておきたいのは、パイプラインの中のいくつかの関数は元のデータフレームを変更するということです。したがって、上記のパイプラインを使用すると、dfも更新されます。

この問題を解決する一つの方法は、パイプラインで元のデータフレームのコピーを使用することです。もし、元のデータフレームをそのままにしておいても構わないのであれば、パイプラインの中でそれを使うことができます。

パイプラインを次のように更新してみます。

my_df = df.copy()
df_processed = (my_df.pipe(fill_missing_values).pipe(drop_duplicates, "id").pipe(remove_outliers, ["A","B& quot;]))


元のデータフレームと処理後のデータフレームを見てみましょう。

まとめ

もちろん、これらの関数を個別に使用しても同じ作業を行うことは可能です。しかし、パイプライン関数は、複数の関数を1つの操作にまとめるための、構造化され整理された方法を提供します。

生データとタスクによっては、前処理に追加のステップが含まれることがあります。パイプライン関数には、必要に応じていくつでもステップを追加することができます。ステップの数が増えるにつれて、パイプライン関数の構文は、関数を個別に実行する場合と比較して明確になります。

以上、Python最適化データ前処理手法「Pandas pipe」について詳しく解説しました。pandas pipeのデータ前処理最適化については、Scripting Houseの他の関連記事もフォローしてください