【アイデミー学習録】データクレンジング (2) DataFrameの利用

NO IMAGE

欠損値を処理する

読み込んだデータに空白があると、NaN(Not a Number)を返す。

NaNはそのままでは使えないですし、一括でデータ処理ができなくなったりします。

データ欠損は前後で除去したり、補完したり、前後のデータを使用したり。

色々とあるが、いくつかの手法を学びました。

dropna()関数でNaNを除去

dropna()関数を利用すると、NaNを含む行を全て除去できる。

欠損があるDataFrame を 変数sampleとすると、以下のように利用できる。

sample.dropna()

ただこれだと、NaNが入る行はすべて除去されてしまいます。

とりぞー
とりぞー

例えば、4列目にNaNが多ければ、他の列のデータも巻き添えを食らって削除されてしまう。

なので、NaNの少ない列だけを救い出してdropna()関数を入れることもできる。

sample([1,2]).dropna()

fillna()関数で代替データを埋める

NaNを代替データに置き換える際に、fillna()関数を利用できる。

NaNに0を入力する場合

sample.fillna(0)

NaNに前行のデータを入れる場合、fillna(method = “ffill” )

sample.fillna(method=”ffill”)

mean()関数で平均値を入れる

無難なやり方では平均値を入力して、データ補間することもありますよね。

fillna()関数とmean()関数を組み合わせて、以下のように利用することもできるようだ。

sample.fillna(sample.mean())

なお、mean()はデフォルトで列の平均が計算される、とのこと。

行の平均を取る際は以下のようにaxis=1を取る必要がある。

sample.fillna(sample.mean(axis=1))

代表値を算出する

データ分析とは、数多くのデータから代表的な値に落とし込むことで、特徴付ける作業をすること。

この代表値としては、平均値、最大・最小などがあります。

Pandasで列ごとの平均値を算出

Pandasを用いると楽なようだ。つまりPandasでcsvのファイルを読み取り、カラム名を設定した後に、列ごとに平均値を算出することができる。

import pandas as pd

#csvファイル読み込み
df = pd.read_csv("/ファイルパス/name.csv", header = None)

#各カラムに名前を定義
df.columns = ["A", "B", "C"]
#DataFrame "df" のkey="B"についての平均値を算出
df["B"].mean()

duplicated()メソッドで重複データ削除

データの精度を高める上で、二重カウントを防ぐ必要があります。

以下のduplicated()メソッドを使うことで、重複を抽出・削除ができます。

① 重複データを抽出

A.duplicated()

②重複データを削除し、データ出力

A.drop_duplicates()

.map()関数でマッピング

DataFrameを作成した後に、辞書型{key:value}のkeyに対応するvalueの列を追加することができる。

講座では、辞書型変数city_map において、key = “city”に対応するvalueの列を”region”とし、DataFrame Aに追加する方法は以下と紹介されている。

A["region"] = A["city"].map(city_map)
A #出力

cut()関数でビンに分割

ビンとは、数値データを大まかな区切りのことで、ビン分割とは区切りを作って、区切りごとの数量をカウントする処理のこと。

DataFrame Aに対して、ビン分割は以下の手順となる。

#ビンの区切りを作る
year_bins = [2000,2005,2010,2015,2020]
#yearsをkeyとして、year_binsをビン分割する
year_cut_data = pd.cut(A.years, year_bins)
year_cut_data #出力
#出力結果
0 (2000,2005]1 (2010,2015]2 (2005,2010]3 (2000,2005]4 (2015,2020]Name: year, dtype:category
Categories(4, interval[int64]: [(2000, 2005] < (2005, 2010] < (2010, 2015] < (2015, 2020]]

“(2000, 2005]”という表記があった場合、2000はビンに含まれず、2005はビンに含まれるという意味合い。

ビンに名前もつけられる

ビンごとに数を集計することも可能。

pd.value_counts(year_cut_data)

また、ビンに名前をつけることも可能。

#ビンの区切りを作る
year_bins = ["2000","2005","2010","2015","2020"]year_names = ["first2000","second2005","third2010","fourth2015","fifth2020"]
#yearsをkeyとして、year_binsをビン分割する
year_cut_data = pd.cut(A.years, year_bins, labels=year_names)
pd.value_counts(year_cut_data) #ビンの数を集計
#出力結果
second2005 5
first2000 4
third2010 3
fifth2020 2
fourth2015 1
Name: year, dtype:int64

cut()関数の第2引数で分割数を指定

#yearsをkeyとして、第2引数でビン分割する
year_cut_data = pd.cut(A.yeas, 2)
year_cut_data #出力