パイソン PandasのDataFrameで欠損データを処理する方法

Pandas はデータ解析とデータ操作のための Python ライブラリです。

Pandasのほぼ全ての操作は、大量のデータを扱うために作られた抽象的なデータ構造である DataFrames を中心に行われます。

このような大量のデータの中には、様々な理由で欠落しているものがあるはずです。

その結果、DataFrameに欠損(null/None/Nan)した値が入ってしまいます。

この記事では、Pandasの DataFrame で欠損データを処理する方法について説明します。

データ検査

実世界のデータセットが完璧であることは稀である。

欠損値、誤ったデータ型、読めない文字、誤った行などが含まれているかもしれない。

適切なデータ分析を行うための最初のステップは、後で使用するデータのクリーニングと整理である。

ここでは、データセットで発生する可能性のある、データに関連するいくつかの一般的な問題について説明します。

今回は少人数の従業員のデータセットを扱う。

.csv` ファイルは次のようなものです。

First Name,Gender,Salary,Bonus %,Senior Management,Team
Douglas,Male,97308,6.945,TRUE,Marketing
Thomas,Male,61933,NaN,TRUE
Jerry,Male,NA,9.34,TRUE,Finance
Dennis,n.a.,115163,10.125,FALSE,Legal
,Female,0,11.598,,Finance
Angela,,,18.523,TRUE,Engineering
Shawn,Male,111737,6.414,FALSE,na
Rachel,Female,142032,12.599,FALSE,Business Development
Linda,Female,57427,9.557,TRUE,Client Services
Stephanie,Female,36844,5.574,TRUE,Business Development
,,,,,


これを DataFrame にインポートしてみましょう。

df = pd.read_csv('out.csv')
df


この結果は

データセットを詳しく見てみると、特定のカラムの値が空の文字列 ''NAまたはNaNである場合、Pandas は自動的にNaNを代入していることがわかります。

しかし、欠損値をカスタム値で表現する場合もあります。

例えば、数値カラムの場合は’na’または0` という文字列です。

例えば、6行目の Team カラムの値は na であり、5行目の Salary カラムの値は 0 です。

欠落データ値のカスタマイズ

我々のデータセットでは、これらを欠損値として考慮したい。

  1. 給与」列の値が「0」である。
  2. Teamカラムのna` 値

これは、 na_values 引数を使用して、カスタム欠損値を設定することで実現できます。

この引数は、キーがカラム名、値が欠損とみなされるデータ値を表す辞書を表します。

# This means that in Salary column, 0 is also considered a missing value.
# And 'na' is considered a missing value in the Team column.
df = pd.read_csv('out.csv', na_values={"Salary" : [0], "Team" : ['na']})
df


この結果は

一方、すべての列で欠損値として扱わなければならない値のリストをマップしたい場合は、 na_values パラメータに欠損値としてグローバルに考慮したい候補のリストを渡します。

missing_values = ["n.a.","NA","n/a", "na", 0]
df = pd.read_csv('out.csv', na_values = missing_values)
df


この結果、以下のようになります。

ここで、4行目の Gender の値も NaN であることに注意してください。

なぜなら、上で n.a. を欠損値として定義したからです。

どの実装を選択するかは、データセットの性質に依存する。

例えば、データセットの数値列の中には 0 を欠損値として扱う必要があるものもあれば、そうでないものもあるかもしれません。

したがって、列に基づいて欠損値をカスタマイズする最初のアプローチを使用することができます。

同様に、例えば 0 を欠損値としてグローバルに扱いたい場合は、2 番目の方法を利用し、 na_values 引数にそのような値の配列を渡せばよいでしょう。

DataFrame` 内のすべての欠損値を特定し、正しいアノテーションを施した後、欠損データを扱う方法はいくつかあります。

欠落値のある行の削除

1つのアプローチとして、欠損値を含むすべての行を削除することができます。

これは、専用の dropna() 関数で簡単に行うことができます。

# Drops all rows with NaN values
df.dropna(axis=0,inplace=True)


この結果は

inplace = Trueは、新しいものを返すことなく、既存のDataFrameにすべての変更を加えます。

これがなければ、DataFrame`を自分自身に再割り当てする必要があります。

引数 axis は、行と列のどちらを扱うかを指定します。

0 が行で、1 が列です。

最低でも 1 つの NaN 値を含む行を削除するか、すべての NaN 値を削除するかは、 dropna メソッドの how パラメータを設定することで制御することができます。

how : {‘any’, ‘all’}.

  • any: NA値が1つでもある場合、そのラベルを削除します。
  • all: 全ての値がNAの場合、そのラベルを削除します。
df.dropna(axis=0,inplace=True, how='all')


how=all`は行からすべての値が欠落している場合にのみ行を削除するので、これはデータセットから最後の行を削除することになります。

同様に、欠損値を含む列を削除するには、 dropna メソッドで axis=1 を設定するだけです。

欠測値の記入

欠損値を含む行が大量にある場合、その行を削除するのは最善の方法ではないかもしれません。

そのような行には他の列の貴重なデータが含まれている可能性があり、データを不正確な状態に傾けたくありません。

このような場合、適切な値を割り当てるためのいくつかのオプションがあります。

最も一般的なものを以下に挙げる。

  • NAにデータの平均値、中央値、最頻値を代入する。
  • NAを定数値で埋める
  • フォワードフィルまたはバックワードフィルNA
  • データを補間してNAを埋める

これらを一つずつ見ていこう。

欠落しているデータフレームの値を列の平均値、中央値、最頻値で埋める

まず、fillna() メソッドから始めましょう。

これは、NAマークのついた値を、このメソッドに与えた値で埋めます。

例えば、ある列で .median(), .mode(), .mean() 関数を使用し、それらをフィル値として与えることができます。

# Using median
df['Salary'].fillna(df['Salary'].median(), inplace=True)

# Using mean
df['Salary'].fillna(int(df['Salary'].mean()), inplace=True)

# Using mode
df['Salary'].fillna(int(df['Salary'].mode()), inplace=True)


これで、ある人の行に給与がない場合、その値を埋めるために平均値、最頻値、中央値が使われます。

この方法では、これらの人々をデータセットから削除することはありませんし、給与の値に歪みを与えることもありません。

この方法は完璧ではありませんが、平均値をいくら足しても平均値は変わらないので、データセット全体に影響を与えない値を導入することができます。

欠落しているデータフレームの値を定数で埋める

NA マークの値を定数値で埋めることもできます。

例えば、特殊な文字列や数値を入れることができます。

df['Salary'].fillna(0, inplace=True)


少なくとも、これらの値は naNaN ではなく、実際の値になっています。

欠落しているデータフレーム値を前方修正する

このメソッドは、欠損値を、その前に発生した欠損していない最初の値で埋める。

df['Salary'].fillna(method='ffill', inplace=True)


欠落しているデータフレームの値を後方修正する。

このメソッドは、欠損値を、その後に発生する欠損していない最初の値で埋めます。

df['Salary'].fillna(method='bfill', inplace=True)


欠損したデータフレームの値を補間する

最後に、このメソッドは数学的な補間を使用して、欠損値の代わりにどのような値があったかを判断します。

df['Salary'].interpolate(method='polynomial')


結論

データのクリーニングと前処理は、すべてのデータ分析および各データサイエンスプロジェクトにおいて非常に重要な部分です。

この記事では、欠損値をカスタマイズしたり、平均値、中央値、最頻値、定数値、前方充填、後方充填、補間を含むさまざまな方法を使用して欠損値を埋め込むなど、欠損データを処理するいくつかのテクニックについて説明しました。

タイトルとURLをコピーしました