LoginSignup
22
56

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-02-01

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")
22
56
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
22
56