Python
numpy
pandas
Python3
DataScience

Pandas 基礎とよく使う機能メモ


pandas 基本機能

基礎項目に加え、データサイエンス・機械学習、Kaggle等でよく使う機能をまとめました。

pandas_logo.png

Pandasは、Pythonでデータ分析を行うためのライブラリで、データの読み込みや編集、統計量の表示が可能。

公式ドキュメント:http://pandas.pydata.org/pandas-docs/stable/


0.ライブラリのインポート

import pandas as pd


1.シリーズとデータフレーム

pandasには、Numpyをベースとした Series と DataFrame という型が存在する。


■ Seriesの生成

ser = pd.Series([10, 15, 20, 25])

>>> ser
0 10
1 15
2 20
3 25
dtype: int64


■ DataFrameの生成

pd.DataFrame([[100, "a", True],

[150, "b", False],
[300, "c", False],
[550, "d", True]])

Screen Shot 2019-01-27 at 16.36.27.png

 DataFrameオブジェクトを作る方法は多数ある

pd.DataFrame(np.arange(12).reshape((3, 4)))

Screen Shot 2019-01-27 at 16.37.42.png

# 辞書からデータフレームを作成

pd.DataFrame({
'A' : [1, 5, 2, 7, 3],
'B' : [1, 6, 2, 2, 4]
})

Screen Shot 2019-01-27 at 16.34.03.png


2.データの基本操作・整形

生成したデータを使い基本操作を解説します。


■ データの作成

df = pd.DataFrame(np.arange(15).reshape((3, 5)))

df

Screen Shot 2019-01-27 at 17.30.09.png


■ 行名、列名の指定

df.index = ["01", "02", "03"]

df.columns = ["A", "B", "C", "D", "E"]
df

Screen Shot 2019-01-27 at 17.35.47.png


■ 列を指定し表示

df["A"] #A列のみ表示

Screen Shot 2019-01-27 at 17.39.19.png


■ 複数の列の指定

df[["A", "B"]] #[]忘れないように..

Screen Shot 2019-01-27 at 17.41.00.png


■ 行の指定

df[1:] #2行目以降を表示

Screen Shot 2019-01-27 at 17.46.13.png


■ locメソッドを使った範囲指定

 loc[]の引数には、行名、列名を入力する

df.loc["02", ["B", "D"]] #行"02"、列"B"と"D"の値を出力

Screen Shot 2019-01-27 at 17.53.06.png


■ ilocメソッドを使った範囲指定

 loc[]の引数には、行番号、列番号を入力する

df.iloc[:2, 2:4] 

Screen Shot 2019-01-27 at 18.00.03.png


■ 条件で抽出

df[df["E"] > 5] #列Eが5より大きいデータを抽出

Screen Shot 2019-01-27 at 18.35.29.png


■ queryメソッドで抽出

SQL構文のように複数条件で抽出可能

df.query("A > 3 and C < 10")

Screen Shot 2019-01-27 at 19.33.51.png


■ 列の削除

df.drop("A", axis=1) #列名を指定

Screen Shot 2019-01-27 at 19.48.45.png


■ 行の削除

df.drop(["01", "03"]) 

Screen Shot 2019-01-27 at 21.11.28.png


■ 列の追加

df['new']=[100,200,300]

df

Screen Shot 2019-01-28 at 0.41.01.png


3.データを基本情報を調べる

アヤメのデータを使って基本情報を抽出します。


■ CSVファイルの読み込み

df = pd.read_csv("/Users/..../iris.csv") 

#CSVファイルのローカルアドレスをタプルに入力
#CSVに区切りがある場合はタプルに("~.scv", sep = ",")のように指定する


■ 最初の5行のみ表示

df.head() #タプル内に数字を指定し任意の行数に変えることも可能

Screen Shot 2019-01-27 at 21.13.14.png


■ 最後の5行のみを表示

df.tail()

Screen Shot 2019-01-27 at 21.13.57.png


■ データフレームの大きさを確認

>>> df.shape

(150, 5)  #150行5列のデータフレーム


■ 基本統計量をまとめて表示

df.describe()

Screen Shot 2019-01-27 at 22.03.00.png


■ 基本統計量メソッド



  • .max()  最大値


  • .min() 最小値


  • .mode()  最頻値


  • .mean()  平均値


  • .median()  中央値


  • .std()  標準偏差


  • .count()  件数


  • .corr() 相関係数(列間のデータの相関関係を数値化、主にテーブル全体に対して使う。)


  • .unique() カテゴリカルデータの項目を表示


  • .value_counts()  項目別数量

df.mean() #列ごとの平均を出力

Screen Shot 2019-01-29 at 1.56.19.png


4.その他の実用的な整形メソッド

データ分析で使う様々なメソッドを紹介します。

3.同様アヤメのデータ(df)を使用します。


■ ソート・並べ替え

df.sort_values(by="PetalWidth")

#"PetalWidth"列でソート
#デフォルトでは昇順

Screen Shot 2019-01-28 at 11.37.22.png

df.sort_values(by="PetalWidth",ascending=False)

#降順

Screen Shot 2019-01-28 at 11.38.15.png


■ グループバイ


df_groupby = df.groupby("Name") #Name列で集約されたオブジェクトを作成

df_groupby.mean() #Nameのカテゴリー別平均

Screen Shot 2019-01-28 at 13.47.14.png

df_groupby.describe() #カテゴリー別基本統計量をまとめて表示

Screen Shot 2019-01-28 at 13.50.21.png


■ ピポッドテーブル

新しくデータフレームを作成します

df=DataFrame([['1-09','A','Apple',150],

['1-10','A','Banana',100],
['1-10','C','Orange',200],
['1-10','C','Aplle',170],
['1-11','B','Orange',200],
['1-11','D','Orange',210],
['1-12','B','Banana',110]],
columns=['Date','Shop','Fruit','Price'])
df

Screen Shot 2019-01-28 at 21.27.57.png

df.pivot_table(values = 'Price', index = 'Shop', aggfunc = sum)

#店舗別の売上合計

Screen Shot 2019-01-28 at 21.32.14.png

df.pivot_table(values = 'Price', index = 'Shop', columns = 'Fruit', aggfunc = sum)

#columnsを追加し商品別に売上を表示

Screen Shot 2019-01-28 at 22.07.41.png

df.pivot_table(values = 'Price', index = 'Shop', columns = 'Fruit', 

aggfunc = sum, fill_value = 0)
#fill_value = 0 でNaNを0に変換

Screen Shot 2019-01-28 at 22.14.15.png

df.pivot_table(values = 'Price', index = 'Shop', columns = 'Fruit', 

aggfunc = sum, fill_value = 0, margins = True)
#margins = True 合計を表示

Screen Shot 2019-01-28 at 22.18.14.png

df.pivot_table(values = 'Price', index = ['Date','Shop'], columns = 'Fruit', 

aggfunc = sum, fill_value = 0, margins = True)
#'Date'を加えてindexを階層化

Screen Shot 2019-01-28 at 22.22.47.png


■ データフレームの連結

データフレーム df を改めて確認

df

Screen Shot 2019-01-28 at 22.36.14.png

同じ構造をもつ df_2 を作成

df_2 = DataFrame([['1-13','D','Banana',100],

['1-13','C','Orange',200],
['1-13','B','Apple',150],
['1-14','C','Aplle',170],
['1-14','A','Banana',120],
['1-15','C','Orange',210],
['1-15','D','Banana',100]],
columns=['Date','Shop','Fruit','Price'])
df_2

Screen Shot 2019-01-28 at 22.48.16.png

df、 df_2 を行で連結

pd.concat([df, df_2], ignore_index=True)

#ignore_index=True でインデックスの振り直しが可能

Screen Shot 2019-01-28 at 22.48.55.png

df、 df_2 を列で連結

pd.concat([df, df_2], axis=1, join_axes=[df.index])

Screen Shot 2019-01-28 at 23.01.06.png

連結元のデータをラベルで分けて連結

pd.concat([df, df_2], axis=1, join_axes=[df.index], keys=['X', 'Y'])

Screen Shot 2019-01-28 at 23.17.58.png


■ データフレームの結合

引き続きデータフレーム df を使用

df

Screen Shot 2019-01-28 at 22.36.14.png

*df_3を作成 *

df_3 = DataFrame([['1','A','East'],

['2','B','West'],
['3','C','South'],
['4','D','North'],
['5','E','EC']],
columns=['Shop_No','Shop','Area'])
df_3

Screen Shot 2019-01-29 at 1.20.04.png

'Shop'を基点に結合

pd.merge(df, df_3, on='Shop')

Screen Shot 2019-01-29 at 0.58.49.png

howで結合方法を選択可能


  • inner: 両方のデータに含まれるキーだけを残す。(内部結合)

  • left: 1つめのデータのキーをすべて残す。(左外部結合)

  • right: 2つめのデータのキーをすべて残す。(右外部結合)

  • outer: すべてのキーを残す。(完全外部結合)

pd.merge(df, df_3, on='Shop', how='left')

Screen Shot 2019-01-29 at 1.23.29.png

pd.merge(df, df_3, on='Shop', how='right')

Screen Shot 2019-01-29 at 1.23.34.png


5.その他メモ


■ インデックス番号で抽出

df.ix[5:10]


■ データ変換(DataFrame → Numpy配列)

アルゴリズムによってはDataFrameのままでは読み込めないものもあり、その際に変換が必要。

df["A"].values  #列AをNumpy配列に変換


■ データフレームに関数を適用

#データフレームの全ての値を2乗にしたい場合

func = lambda x: x**2
df.apply(func)

#列に適用し更新したい場合
df["A"] = df["A"].apply(func)

#タプルにそのまま関数を書いても良い
df.apply(lambda x: x**2)


■ インデックス変更・更新

df.set_index('Date', inplace=True)

#第一引数にindexにしたい列名を入力
#inplace=True でデータを更新


■ オブジェクト型のみに絞る / オブジェクト型を除外

#オブジェクト型のみ出力

df.select_dtypes(include=['object'])

#オブジェクト型を除外
df.select_dtypes(exclude=['object'])


■ エクセルファイルの読み込み

pd.read_excel("~.xlsx")