前のパートに戻る 完了して次のパートへ  

  2章:Pandas入門

目次


  • Pandasとは
  • この章の目的と最終コード
  • データフレームの作成
  • データフレームに関する用語説明
  • データフレーム基礎操作・ファイルを読み込み
  • データフレーム基礎操作・新たな列の作成
  • データフレーム基礎操作・値の置換
  • データフレーム基礎操作・欠損値を埋める
  • データフレーム基礎操作・列の削除

Pandasとは


Excelなどで使われるようなテーブル形式のデータをPythonで扱うためのライブラリです。

Pandasでは「データフレーム形式」というものを用いることで、高速かつ可読性の高い形でテーブルを扱うことができます。

ライブラリの読み込みは import構文で行うことができます。

  • ソースコード

import pandas as pd # 出力なし

この章の目的と最終コード


この章では、以下のテーブルをpandas経由で次のように変換してみます。

  • 変換前

  • 変換後

このテーブルは次の章で使うTitanicのデータをものすごく小さくしたものです。

生存の列は1が生存を、0が非生存を表します。

年齢の列の-(ハイフン)は欠損値を表します。(欠損値については後述します)

最終コードは以下のようになっています。

  • ソースコード

import numpy as np
import pandas as pd

df = pd.DataFrame({
    "性別": ["female", "male", "female", "male"],
    "年齢": [53, 21, 31, np.nan],
    "兄弟姉妹": [0, 1, 1, 2],
    "親子": [0, 1, 3, 2],
    "生存": [1, 0, 1, 1]
}, index=["1", "2", "3", "4"])

display(df) # 編集前のdataframeの出力

# 家族列を足す
df["家族"] = df["兄弟姉妹"] + df["親子"] + 1

# 性別列の置換
df["性別"] = df["性別"].replace({"female": 0, "male": 1})

# 年齢列のNaNを年齢の平均値で埋める
df["年齢"] = df["年齢"].fillna(df["年齢"].mean())

# 兄弟姉妹、親子列の削除
df.drop(["兄弟姉妹", "親子"], axis=1, inplace=True)

display(df) # 編集後のdataframeの出力

  • 結果(以降、テーブルが2つ出ている場合、変更前 → 変更後の順で表示しています)

データフレームの作成


pd.Dataframe() でデータフレームを作成できます。

ここでは本番で使うデータをものすごーく小さくしたデータを作ってみます。

  • ソースコード

import numpy as np
import pandas as pd

df = pd.DataFrame({
    "性別": ["female", "male", "female", "male"],
    "年齢": [53, 21, 31, np.nan],
    "兄弟姉妹": [0, 1, 1, 2],
    "親子": [0, 1, 3, 2],
    "生存": [1, 0, 1, 1]
}, index=["1", "2", "3", "4"])

df

  • 結果

np.nanは欠損値を作るための値です。ここではあまり気にする必要はありません。)

最後にdfと打つことで、変数が見やすい形式で出力されていることがわかります。

キーを列名, バリューを値の配列として与えることで、新規データフレームを生成できます。

なお、dfという変数名は、データフレーム (data frame) というデータ構造の略語で、 

dataframe型の変数にはdfという変数名がよく使用されます。

データフレームに関する用語説明


index, column, Seriesについて説明します。

イメージとしては以下です。

自分が扱っているデータ形式がデータフレームであるか、シリーズであるかは忘れやすいです。

エラーが起きたときには注意してみてください。

データフレーム基礎操作・ファイルを読み込み


今回は辞書からデータフレームを作成しましたが、外部のファイルを読み込むこともできます。

(実際のKaggleでは、入力ファイルはほとんどの場合csvで与えられます。)

pandasにはCSVファイルを読み込むための関数(pd.read_csv())が用意されています。

ここではGoogle Colaboratoryに用意されているサンプルデータを読み込みます。

  • ソースコード

df = pd.read_csv('sample_data/california_housing_train.csv')
df.head()

  • 結果

df.head() は読み込んだデータフレームの内、頭5行だけ表示するメソッドです。

データフレームが巨大なときは、とりあえずdf.head()で見るとよいでしょう。

データフレーム基礎操作・新たな列の作成


まず、「兄弟姉妹」と「親子」の列から、家族の人数を出してみます。

df[列名] = 配列で新たな列を作成できます。

  • ソースコード

import pandas as pd
from IPython.display import display # 2つ以上DataFrameをNotebook上に出す用。実際のKaggleでは使用頻度は低い

# データの準備
df = pd.DataFrame({
    "性別": ["female", "male", "female", "male"],
    "年齢": [53, 21, 31, np.nan],
    "兄弟姉妹": [0, 1, 1, 2],
    "親子": [0, 1, 3, 2],
    "生存": [1, 0, 1, 1]
}, index=["1", "2", "3", "4"])
display(df)

# 新たな列の作成
df["家族"] = df["兄弟姉妹"] + df["親子"] + 1
display(df)

  • 結果

pandasは列方向の操作はしやすく、列名を直接指定して四則演算などができます。

df[列名] は単体で出力するとSeriesが取り出されます。

実際に df["親子"] と打つと、「親子」の列が取り出されているのがわかります。

df["親子"]の中身としては、上で説明したpandas.seriesが入っています。)

  • ソースコード

df["親子"]

  • 結果
1    0
2    1
3    3
4    2
Name: 親子, dtype: int64

左側にindexが、右側に実際の値が並んで出力されていることがわかります。

データフレーム基礎操作・値の置換


次に、「性別」列の値の置換をします。

df.replace(辞書) でデータフレーム内の値を置換できます。

今回、「性別」列のみ置換ということを意識するため、「性別」列だけを抽出して置換してみます。

  • ソースコード

import pandas as pd
from IPython.display import display # 2つ以上DataFrameをNotebook上に出す用

# データの準備
df = pd.DataFrame({
    "性別": ["female", "male", "female", "male"],
    "年齢": [53, 21, 31, np.nan],
    "兄弟姉妹": [0, 1, 1, 2],
    "親子": [0, 1, 3, 2],
    "生存": [1, 0, 1, 1]
}, index=["1", "2", "3", "4"])
display(df)

# 実際の操作
df["性別"] = df["性別"].replace({"female": 0, "male": 1})
display(df)

  • 結果

「性別」列の値が置換されていることがわかります。

データフレーム基礎操作・欠損値を埋める


機械学習に限らず、データを操作するときにつきものなのが、欠損値(データの欠け)です。

Pandasの機能を用いてこの欠損値を埋めてみます。

まず、どのような時に欠損値(NaN)ができるかを見てみます。

  • ソースコード

# ファイルを書き出す
f = open("_test_data.csv", "w")
f.write(",C1,C2,C3\n")
f.write("R1,1,2,3\n")
f.write("R2,2,,1\n")
f.write("R3,3,7,9\n")
f.close() # 出力なし

(上記スクリプトはテストデータを作るのが目的なので、深く理解する必要はありません)

左サイドバーに現れた_test_data.csvをクリックでも見ることはできますが、

ファイルの内容を確認することのできるcatコマンドで中身を見てみましょう。

  • ソースコード

!cat _test_data.csv

  • 結果
,C1,C2,C3
R1,1,2,3
R2,2,,1
R3,3,7,9

!を頭につけることで、bashのコマンドを打つこともできます。ここではbashのコマンドを利用しています。

上記のように、2行2列目が欠損値になっていることがわかります。

このファイルをpandasで読み込んでみます。

  • ソースコード

df = pd.read_csv("_test_data.csv", index_col=0)
df

  • 結果

R2, C2の値が NaNという値になっていることがわかります。

このように、外部ファイルの値が空になっている部分は NaN で埋められます。

実際のデータを年齢の平均値で埋めてみます。

  • ソースコード

import pandas as pd
from IPython.display import display # 2つ以上DataFrameをNotebook上に出す用

# データの準備
df = pd.DataFrame({
    "性別": ["female", "male", "female", "male"],
    "年齢": [53, 21, 31, np.nan],
    "兄弟姉妹": [0, 1, 1, 2],
    "親子": [0, 1, 3, 2],
    "生存": [1, 0, 1, 1]
}, index=["1", "2", "3", "4"])
display(df)

# 実際の操作
ave_age = df["年齢"].mean()
df["年齢"] = df["年齢"].fillna(ave_age)
display(df)

  • 結果

データフレームの値が年齢の平均値で埋められた様子がわかるかと思います。

df["年齢"].mean() についてはおまけのPandas応用のページ に記載しているので、そちらもご参照ください。

データフレーム基礎操作・列の削除


「兄弟姉妹」と「親子」の列を削除してみます。

df.drop([列名], axis=1, inplace=True) で列を削除できます。

axis=1 は列方向の操作を表し、 inplace=Trueはdfを直接書き換える(破壊的メソッド)を表しています。

  • ソースコード

import pandas as pd
from IPython.display import display # 2つ以上DataFrameをNotebook上に出す用

# データの準備
df = pd.DataFrame({
    "性別": ["female", "male", "female", "male"],
    "年齢": [53, 21, 31, np.nan],
    "兄弟姉妹": [0, 1, 1, 2],
    "親子": [0, 1, 3, 2],
    "生存": [1, 0, 1, 1]
}, index=["1", "2", "3", "4"])
display(df)

# 実際の操作
df.drop(["兄弟姉妹", "親子"], axis=1, inplace=True)
display(df)

  • 結果

兄弟姉妹、親子の列が削除されていればOKです。

おわりに


上記をまとめると、最終コードと同じ様になります。

  • ソースコード

import numpy as np
import pandas as pd
import IPython.display as display

df = pd.DataFrame({
    "性別": ["female", "male", "female", "male"],
    "年齢": [53, 21, 31, np.nan],
    "兄弟姉妹": [0, 1, 1, 2],
    "親子": [0, 1, 3, 2],
    "生存": [1, 0, 1, 1]
}, index=["1", "2", "3", "4"])

display(df) # 編集前のdataframeの出力

# 家族列を足す
df["家族"] = df["兄弟姉妹"] + df["親子"] + 1

# 性別列の置換
df["性別"] = df["性別"].replace({"female": 0, "male": 1})

# 年齢列のNaNを埋める
df["年齢"] = df["年齢"].fillna(df["年齢"].mean())

# 兄弟姉妹、親子列の削除
df.drop(["兄弟姉妹", "親子"], axis=1, inplace=True)

display(df) # 編集後のdataframeの出力

  • 結果

3章でKaggleに登録したら、4章では実際のデータを扱います。

応用編


ここで扱っていないけど、頻出の操作についてはおまけ_Pandas応用編にまとめました。

時間がある場合は、そちらもご参照ください。

議論
2 質問
このコースの評価は?