Pandas

データエンジニアリング基礎

1

PandasPandas (Python data analysis library)

データ分析を行うための基本的なライブラリ
表形式のデータなどを取り扱う
記述統計に対する計算
推測統計や機械学習に利用するデータ形式の基本
記述統計：平均などの量からデータの特徴を考察する
推測統計：サンプルから母集団の特徴を考察する
データエンジニアリング基礎

2

パッケージの利用
importによる利用：pandasパッケージの全機能を利用可能
パッケージをという名前で読み込みパッケージのread_excel関数を利用

import pandas # pandas
pandaspandas.read_excel('sample.xlsx') # pandas

パッケージを pd という別名で読み込みパッケージのread_excel関数を利用

import pandas as pd # pandas
pd.read_excel('sample.xlsx') # pandas
from ... import ...

データエンジニアリング基礎

による利用： pandasではあまりやらない3基本データ構造

列データ（一次元配列相当）
DataFrame: 表形式データ（二次元配列相当）
Series:

データエンジニアリング基礎

4Series

一次元配列
内部的には numpy 配列（ndarray）を持つ
同じ型の配列
要素毎の四則演算
インデックスアクセス
要素に「名前」でアクセスできる（Python Dict と同じ）
データエンジニアリング基礎

5

の生成（インデックス省略）

Seriesimport numpy as np
import pandas as pd

リストによる定義#
d1 = [4, 5, 6, 3, 2]
ser1 = pd.Series(data=d1, dtype='float64') # numpy.float64

配列で定義

で格納

# numpyd2 = np.array([4, 5, 6, 3, 2], dtype='float64')
ser2 = pd.Series(data=d2)

配列 を作ってから持つので，d1書き換わらないは書き換わる

ser1[0] = 10 # d1 -> numpy
ser2[0] = 10 # d2

データエンジニアリング基礎6

の生成（インデックス明示）

Seriesd1 = [4, 5, 6, 3, 2]
ser1 = pd.Series(data=d1, dtype='float64', index=['a', 'b', 'c', 'd', 'e'])d2 = {'a':4, 'b':5, 'c':3, 'd':3, 'e':2}
ser2 = pd.Series(data=d2, dtype='float64')

文字列によるアクセス
インデックスの変更

ser1[0] == ser1['a'] #ser2[0] == ser2['a']ser1.index = [0, 1, 2, 3, 4] #for k,v in ser1.items():
print(k, v)

データエンジニアリング基礎

7

データ操作
d1 = {'a':4, 'b':5, 'c':3, 'd':3, 'e':2}
ser1 = pd.Series(data=d1, dtype='float64')

値で昇順にsort
インデックスで昇順にsort

ser2 = ser1.sort_values() #ser3 = ser2.sort_index() #ser1.drop('a') #a
ser1.append(ser2) #要素 の削除追加

d2 = {'a':4, 'b':None, 'c':np.nan, 'd':3, 'e':pd.NaT}
ser2 = pd.Series(data=d2)
ser2.dropna() #欠損値じゃないものだけ抽出

データエンジニアリング基礎

8

統計処理（記述統計）
d1 = {'a':4, 'b':5, 'c':3, 'd':3, 'e':2}
ser1 = pd.Series(data=d1, dtype='float64')
ser1.describe() #ser1.sum()ser1.mean()ser1.median()
ser1.std()
ser1.var()
ser1.min()ser1.max()

データエンジニアリング基礎

データの要約9

DataFrame

二次元配列（表形式データ・構造化データ）
内部的には複数の Series から作られる
一つの列が一つの Series
列に「名前」でアクセスできる（Python Dict と同じ）

データエンジニアリング基礎

10

の生成

DataFrame

d1 = [[3, 4, 7, 1, 3], [4, 5, 6, 3, 2], [1, 5, 3, 2, 4]]
df1 = pd.DataFrame(data=d1)
d2 = [[3, True, 7.0, 1.3, 3], [4, True, 6.0, 3, 2], [1, False, 3.0, 2, True]]df2 = pd.DataFrame(data=d2)
d3 = [[3, True, 7.0, 1.3, 3], [4, True, 6.0, 3, 2], [1, False, 3.0, 2, True]]df3 = pd.DataFrame(data=d3, dtype='float64') #

列ごとに異なる型をもつ#
df2[0].dtypes
df2[1].dtypes
df2[2].dtypes
df2[3].dtypes #df2[4].dtypes #データエンジニアリング基礎

型変換を明示

暗黙の型変換変換できないものが混在しているときはオブジェクト型
11

の生成（ラベル）

DataFrame

d1 = {'a': [3, 4, 7, 1, 3], 'b': [4, 5, 6, 3, 2], 'c': [1, 5, 3, 2, 4]}
df1 = pd.DataFrame(data=d1, index=['1', '2', '3', '4', '5'])d2 = [[3, True, 7.0, 1.3, 3], [4, True, 6.0, 3, 2], [1, False, 3.0, 2, True]]df2 = pd.DataFrame(data=d2, columns=['col1', 'col2', 'col3', 'col4', 'col5'], index=['1', '2', '3'])
df1['a'] #原則列名でアクセス．前の例は列名が「数字」

データエンジニアリング基礎

12データへのアクセス
d1 = {'a': [3, 4, 7, 1, 3], 'b': [4, 5, 6, 3, 2], 'c': [1, 5, 3, 2, 4]}
df1 = pd.DataFrame(data=d1, index=['1', '2', '3', '4', '5'])（列）へアクセスしてから要素へアクセス# Series
df1['a'][0]df1['a']['1']

メソッド

# loc
df1.loc['1', 'a'] #df1.loc['1'] #メソッド

表を行列としてみて（行，列）の順で指定
行データの抽出（戻り値はSeries型）# ilocdf1.iloc[0, 0] #df1.iloc[0] #表を行列としてみて（行，列）の順で指定．インデックスアクセス
行データの抽出．インデックスアクセス※単独要素の場合は loc , iloc より at , iat の方が処理が速い
データエンジニアリング基礎

13

データ操作（追加・削除）
d1 = {'a': [3, 4, 7, 1, 3], 'b': [4, 5, 6, 3, 2], 'c': [1, 5, 3, 2, 4]}
df1 = pd.DataFrame(data=d1, index=['1', '2', '3', '4', '5'], dtype='float64')

列の追加#
df1['d'] = [3,4,2,1,3] # Python
df1['e'] = np.array([3,4,2,1,3], dtype='float64') # numpy
df1['f'] = pd.Series(data=[3,4,2,1,3], dtype='float64', index=['2', '3', '4', '5', '6']) # Series

リスト

行の追加

#
df1.loc['6'] = [4, 5, 6, 7, 4, 3] #行の削除#
df2 = df1.drop('1') #

列の削除

欠損値処理

データエンジニアリング基礎

型は強制変換行を削除したDataFrameを作成#
df3 = df1.drop('a', axis=1) #df3 = df1.drop(columns='a') ##df4 = df1.dropna() #配列

列を削除したDataFrameを作成
列を削除したDataFrameを作成

欠損値を含む行と列を削除したDataFrameを作成
14

データ操作（並べ替え，抽出）
d1 = {'a': [3, 4, 7, 1, 3], 'b': [4, 5, 6, 3, 2], 'c': [1, 5, 3, 2, 4]}
df1 = pd.DataFrame(data=d1, index=['1', '2', '3', '4', '5'], dtype='float64')

列 の値で並べ替え
列 a, b の値で並べ替え
df4 = df1.query('a >= 4') # 列aが4以上の列を抽出
df2 = df1.sort_values(by='a') #adf3 = df1.sort_values(by=['a','b']) #データエンジニアリング基礎

15

統計処理（記述統計）
d1 = {'a': [3, 4, 7, 1, 3], 'b': [4, 5, 6, 3, 2], 'c': [1, 5, 3, 2, 4]}
df1 = pd.DataFrame(data=d1, index=['1', '2', '3', '4', '5'], dtype='float64')

列毎の要約

#
df1.describe()
df1.sum()
df1.mean()
df1.median()
df1.std()
df1.var()
df1.min()
df1.max()

データエンジニアリング基礎

16データの読み込み
name,age,score
taro,10,100
jiro,20,50hanako,25,80
df1 = pd.read_csv('data.csv')
df1.to_csv('data2.csv', index=False)

データエンジニアリング基礎

17