0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

データクレンジング2 DataFrameを用いたデータクレンジング

Last updated at Posted at 2020-09-21

Aidemy 2020/9/30

 はじめに

 こんにちは、んがょぺです!バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。前回が初投稿でしたが、多くの方に読んでいただけてとても嬉しいです。ありがとうございます!
 今回は、データクレンジングの2つ目の投稿になります。どうぞよろしくお願いします。

*本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・CSVについて
・欠損値(NaN)に対する処理
・辞書でキーごとにデータを処理する

1 CSV

PandasでCSVを読み込む

・CSVとは、データ分析でよく使われるデータファイルのこと。まずはPandasを使って読み込む。
・pd.read_csv("データのファイル名",header=ヘッダーとなる列の指定)
*headerの指定が特にない時はNone

import pandas as pd
# wine.csvの読み込み
df = pd.read_csv("./4050_data_cleansing_data/wine.csv", header=None)
# カラムの名前を設定
df.columns = [省略]
#  出力
df

CSVライブラリでCSVの作成

・Pythonに内蔵されている「CSVライブラリ」を使ってCSVを作成する。
・with open("ファイル名","w") as csvfile: とし、その中で
writer=csv.writer(csvfile, lineterminator="\n")
(csvfileと改行コードを引数とするwriterメソッド)を作成し、これを用いて
writer.writerow([データ]) でデータを入力する。

import csv
with open("ファイル名","w") as csvfile:
  writer=csv.writer(csvfile, lineterminator="\n")
  writer.writerow(["version","year","gen"]) #1行目はカラム名
  writer.writerow(["赤緑",1996,1])
  writer.writerow(["金銀",1999,2])
  writer.writerow(["RS",2002,3])

# 読み込み
with open("ファイル名","r") as csvfile:
  print(csvfile.read())
# version,year,gen
# 赤緑,1996,1
# 金銀,1999,2
# RS,2003,3

PandasでCSVの作成

・DataFrameをCSVにする時はこちらの方が簡単
・DataFrameのデータ.to_csv("ファイル名")

data={"version":["赤緑","金銀","RS"],"year":[1996,1999,2002],"gen":[1,2,3]}
df=pd.DataFrame(data)
df.to_csv("ファイル名")

2 欠損値(NaN)に対する処理

NaNを含む行や列の削除

・NaNを含む行や列の削除のことを__「リストワイズ削除」__という。リストワイズ削除はdropna()関数で行う。引数を指定しなければ行が、axis=1に指定すれば列が削除される。
・DataFrameのデータ.dropna()

・リストワイズ削除を使うとデータ数が少なくなりすぎる場合は、欠損の少ない列を残し、そこからNaNを含む行を削除すると良い。これを__「ペアワイズ削除」__という。
・DataFrameのデータ[[残す列]].dropna()

data={"version":["赤緑","金銀","RS"],"year":[1996,1999],"gen":[1]}
df=pd.DataFrame(data)
# リストワイズ削除だとデータが少ないので、version,year列だけ残して、NaNを含む行を削除
df[[0,1]].dropna()
# version year
# 赤緑 1996
# 金銀 1999

欠損値の補完(1)

・削除ではなく代替データの代入で補完する。fillna()関数を使う。引数には「代替データ」または「method="ffill"」(前行の値を適用する)を設定する。
・DataFrameのデータ.fillna()

data={"version":["赤緑","金銀","RS"],"year":[1996,1999],"gen":[1]}
df=pd.DataFrame(data)
# NaNを前のデータで置き換え
df.fillna(method="ffill")
# version year gen
# 赤緑 1996 1
# 金銀 1999 1
# RS  1999 1

欠損値の補完(2)

・fillna()の引数にmean()関数を使うことで、代替データを「その列の平均値」で置き換えられる。
・DataFrameのデータ.fillna(DataFrameのデータ.mean())

data={"version":["赤緑","金銀","RS"],"year":[1996,1999],"gen":[1]}
df=pd.DataFrame(data)
# NaNを前のデータで置き換え
df.fillna(method="ffill")
# version year gen
# 赤緑 1996 1
# 金銀 1999 1
# RS  1997.5 1

3 辞書でキーごとにデータを処理する

キーごとに計算する

・辞書やCSV(DataFrame)のキーごとの平均値や最大値などを、mean()やmax()などの統計関数を使って算出できる。
・辞書やdf[キー].統計関数

df = pd.read_csv("./4050_data_cleansing_data/wine.csv", header=None)
df.columns = ["","Alcohol",(省略)]
#  "Alcohol"の平均値算出
df["Alcohol"].mean()
# 13.000617977528091

重複データの抽出、削除

・全く同じデータの抽出はduplicated()メソッドを使う。削除はdrop_duplicates()メソッドを使う。
・重複のあるデータ.duplicated()
・重複のあるデータ.drop_duplicates()

data={"version":["赤緑","金銀","RS","赤緑"],"year":[1996,1999,2002,1996],"gen":[1,2,3,1]}
df=pd.DataFrame(data)
#  重複データの削除
df.drop_duplicates()
# version,year,gen
# 赤緑,1996,1
# 金銀,1999,2
# RS,2003,3

すでにあるキーに対応する新しいキーを作る

・すでにあるキーに対応する新しいキーを作ることを__「マッピング」__という。
・DataFrameのデータ[新キー] = DataFrameのデータ[参照元のキー].map(辞書型の対応表)

data={"version":["赤緑","金銀","RS"],"year":[1996,1999,2002],"gen":[1,2,3]}
df=pd.DataFrame(data)
# 辞書型の対応表を作成してからマッピング
version_map={"赤緑":"Kanto","金銀":"Johto","RS":"Hoenn"}
df["region"] = df["version"].map(version_map)
df
# version,year,gen,region
# 赤緑,1996,1,Kanto
# 金銀,1999,2,Johto
# RS,2003,3,Hoenn

数値データの範囲を設定してカテゴリ分け

・「0〜5」「6〜10」のように範囲を設定して、範囲ごとにデータを分けたり集計したりする。このような処理のことを「ビン分割」という。ビン分割はpd.cut()で行う。
・pd.cut(データ[範囲を指定するキー], [範囲のリスト], labels=[範囲ごとの名前のリスト]) #ビン分割
・分割数を指定し、自動で範囲を振り分けてくれる方法もある
・pd.cut(データ[範囲を指定するキー], 分割数)
・pd.value_counts(ビン分割したデータ)#分割した範囲ごとのデータ数の集計

data={"version":["赤緑","金銀","RS","DP"],"year":[1996,1999,2002,2006],"gen":[1,2,3,4]}
df=pd.DataFrame(data)
# yearで範囲指定、先に範囲のリストを作成する。
range = [1996,2000,2007]
range_name = ["1996-2000","2000-2007"]
cut_df = pd.cut(df["year"], range, labels=range_name)
pd.value_counts(cut_df)
# 1996-2000  2
# 2000-2007  2

まとめ

・データ分析ではCSVというデータファイルがよく使われる。CSVはpython標準のライブラリかPandasを使って作成される。
・欠損値はdropna()で削除したり、fillna()で補完したりして処理する。
・辞書やDataFlameではキーを参照してvalueの計算をしたり、重複データを削除したり(drop_duplicates)、新キーを作ったり(map)、範囲を指定して分割したり(pd.cut)できる。

以上です。ここまで読んでくださり、ありがとうございます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?