欠損値を処理する
読み込んだデータに空白があると、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 #出力
- 1
- 2