Python PANDAS

Pandasとは

データ分析(データサイエンス)ライブラリ
・データの統計量表示
・データのグラフ化

Series

一次元データ構造
Value + Index
DataFrameの構成要素となる

List→Series

import pandas as pd

list = [‘CakePHP3’, ‘Django’, ‘Spring-Boot’]
s = pd.Series(list)

0 CakePHP3
1 Django
2 Spring-Boot

# Index未定義の場合は自動で定義される

二次元List→Series

list = [[‘CakePHP3’, ‘Laravel’],[‘Django’, ”],[‘Spring-Boot’,’Struts’]]
s = pd.Series(list)

0 [CakePHP3, Laravel]
1 [Django, ]
2 [Spring-Boot, Struts]

# Seriesで二次元を表現すると、値が配列になる

Indexを定義

list = [‘CakePHP3’, ‘Django’, ‘Spring-Boot’]
s = pd.Series(list, index=[‘php’, ‘Python’, ‘Java’])

php CakePHP3
Python Django
Java Spring-Boot
連想配列→Series

dic = {‘php’:’CakePHP3′, ‘Python’:’Django’, ‘Java’:’Spring-Boot’}
s = pd.Series(dic)

php CakePHP3
Python Django
Java Spring-Boot

# 連想配列のKeyが自動でIndexと見なされる

dic = {‘php’:’CakePHP3′, ‘Python’:’Django’, ‘Java’:’Spring-Boot’}
s = pd.Series(dic, index=[‘php’, ‘Python’, ‘Java’, ‘C#’])

php CakePHP3
Python Django
Java Spring-Boot
C# NaN

# Index:C#のValueは指定されていないのでNaN(Not a Number)に

Valueの取得

print(s[0]) # CakePHP3
print(s[‘php’]) # CakePHP3

Valueの追加

result = s.append(s)

php CakePHP3
Python Django
Java Spring-Boot
php CakePHP3
Python Django
Java Spring-Boot

Seriesは二次元にはならない

DataFrame

二次元データ構造
Seriesを要素に持つ

連想配列→DataFrame

Key=Column、Value=Value
dic = {‘FW1’:[‘CakePHP3’, ‘Django’, ‘Spring-Boot’], ‘FW2’:[‘Laravel’, ”, ‘Struts’]}
df = pd.DataFrame(dic, index=[‘php’, ‘Python’, ‘Java’])

FW1 FW2
php CakePHP3 Laravel
Python Django Django
Java Spring-Boot Struts

Valueが配列でない連想配列はエラー
dic = {‘php’:’CakePHP3′, ‘Python’:’Django’, ‘Java’:’Spring-Boot’}
df = pd.DataFrame(dic)
print(df)# エラー

Valueが配列の連想配列からDataFrameを定義
Key=Column、Value=Value
dic = {‘php’:[‘CakePHP3’], ‘Python’:[‘Django’], ‘Java’:[‘Spring-Boot’]}
df = pd.DataFrame(dic)

php Python Java
0 CakePHP3 Django Spring-Boot
リスト→DataFrame

list = [‘CakePHP3’, ‘Django’, ‘Spring-Boot’]
df = pd.DataFrame(list)

0 CakePHP3
1 Django
2 Spring-Boot
Indexを定義

list = [‘CakePHP3’, ‘Django’, ‘Spring-Boot’]
df = pd.DataFrame(list, index=[‘php’, ‘Python’, ‘Java’])

0
php CakePHP3
Python Django
Java Spring-Boot

Columnを定義
list = [‘CakePHP3’, ‘Django’, ‘Spring-Boot’]
df = pd.DataFrame(list, columns=[‘FW’])

FW
0 CakePHP3
1 Django
2 Spring-Boot

Index + Columnを定義
list = [‘CakePHP3’, ‘Django’, ‘Spring-Boot’]
df = pd.DataFrame(list, index=[‘php’, ‘Python’, ‘Java’], columns=[‘FW’])

FW
php CakePHP3
Python Django
Java Spring-Boot
Series→DataFrame

s = pd.Series({‘php’:’CakePHP3′, ‘Python’:’Django’, ‘Java’:’Spring-Boot’})
df = pd.DataFrame(s)

php CakePHP3
Python Django
Java Spring-Boot

Columnを定義
s = pd.Series({‘php’:’CakePHP3′, ‘Python’:’Django’, ‘Java’:’Spring-Boot’})
df = pd.DataFrame(s, columns=[‘FW’] )

FW
php CakePHP3
Python Django
Java Spring-Boot

参考
Seriesの二次元配列
df = pd.DataFrame([s, s])

php Python Java
0 CakePHP3 Django Spring-Boot
1 CakePHP3 Django Spring-Boot

参考
連想配列のValueがSeriesの場合
# Series→DataFrame
idx = [‘php’, ‘Python’, ‘Java’]
FW = pd.Series([‘CakePHP3’, ‘Django’, ‘Spring-Boot’])
exp = pd.Series([3, 1, 3])
dic = {‘FW’:FW, ‘exp’:exp}
df = pd.DataFrame(dic)

FW exp
0 CakePHP3 3
1 Django 1
2 Spring-Boot 3
列追加

df = pd.DataFrame(
{‘FW’:[‘CakePHP3’, ‘Django’, ‘Spring’]},
index=[‘php’, ‘Python’, ‘Java’])

FW
php CakePHP3
Python Django
Java Spring-Boot

df[‘exp’] = 0

FW exp
php CakePHP3 0
Python Django 0
Java Spring-Boot 0

df[‘exp’] = [3, 1, 3]

FW exp
php CakePHP3 3
Python Django 1
Java Spring-Boot 3

要素数不一致エラー
#df[‘exp’] = [3, 1, 3, 5]

関数
new = df.assign(exp=[3, 1, 3], per=[5, 3, 5])

FW exp
php CakePHP3 5
Python Django 3
Java Spring-Boot 5

inplace不可、同名の列を指定した場合は上書き

Seriesで列追加

df = pd.DataFrame({‘FW’:[‘CakePHP3’, ‘Django’, ‘Spring’]})
df.index = [‘php’, ‘Python’, ‘Java’]

FW
php CakePHP3
Python Django
Java Spring

s = pd.Series([3, 1, 3], index=[‘php’, ‘Python’, ‘Java’])

php 3
Python 1
Java 3

df[‘exp’] = s

FW exp
php CakePHP3 3
Python Django 1
Java Spring 3
行列転換

new = df.T

php Python Java
FW CakePHP3 Django Spring
exp 3 1 3

Index

Indexオブジェクト

DBにおける各レコードに名称を付ける様な概念
a = pd.DataFrame(
[[1,1,1,],[2,1,2],[3,2,3]],
#Indexオブジェクト:ラベル
index=[“one”,”two”,”three”],
#Indexオブジェクト:カラム名
columns=[“a”,”b”,”c”]
)

a b c
one 1 1 1
two 2 1 2
three 3 2 3

※ラベル、カラム名は重複可能

print(a.index)
# Index([‘one’, ‘two’, ‘three’], dtype=’object’)

print(a.index[1])
# two
# 0~2まで

print(a.index[0:3])
Index([‘one’, ‘two’, ‘three’], dtype=’object’)

後からIndexのみ定義
a = pd.Series([‘CakePHP3’, ‘Django’, ‘Spring’])
a.Index = [‘php’, ‘Python’, ‘Java’]

Indexオブジェクトの変更エラー

idx = [‘php’, ‘Python’, ‘Java’]
list = [‘CakePHP3’, ‘Django’, ‘Spring’]
col = [‘FW’]
s = pd.Series(list)

0 CakePHP3
1 Django
2 Spring

df = pd.DataFrame(s, columns=[‘FW’], index=idx)

FW
php NaN
Python NaN
Java NaN

→Seriesを定義した時点でIndexも定義されいる為、上書きするとValueがNaNに

Indexオブジェクトの変更方法

print(a.columns)
# Index([‘a’, ‘b’, ‘c’], dtype=’object’)

a.index[1] = ‘new’ # エラー

Index名を変更した新しいDataFrameを取得
b = a.rename(index={‘two’:’new’})
print(b.index)
# Index([‘one’, ‘new’, ‘three’], dtype=’object’)

Indexオブジェクトの置き換え
a.rename(index={‘two’:’new’}, inplace=True)
print(a.index)
# Index([‘one’, ‘new’, ‘three’], dtype=’object’)

Indexを列で設定

df

FW exp
php CakePHP3 3
Python Django 1
Java Spring 3

new = df.set_index(‘FW’)

exp
FW
CakePHP3 3
Django 1
Spring 3

データ情報

行数、列数

print(df.shape)
(行数, 列数)

データ型

print(df.dtypes)

列1 object
列2 int64
列3 float64

要約統計量

result = df[‘列名’].describe()

count 要素の個数
mean 算術平均
std 標準偏差
min 最小値
max 最大値
25% 1/4分位数
50% 中央値(median)
75% 3/4分位数
カウント

指定列の値毎のカウント
df[‘temperature’].value_counts()

7.8 4
13.8 3
28.8 3
25.2 3
26.0 3
グループ化

name列でグループ化
df.groupby([‘name’])

name列でグループ化した上でweek列のカウント数
df.groupby([‘name’])[‘week’].count()

味噌焼き 3
唐揚 1
唐揚げ 1
唐揚げおろし 4
ソート

df.sort_values(by=’kcal’, ascending=True)

NaNを先頭に(デフォルト=’last’)
df.sort_values(by=’kcal’, ascending=False, na_position=’first’)

置換
df.sort_values(by=’kcal’, ascending=False, inplace=True)

複数キーのソート
df.sort_values(by=[‘soldout’,’datetime’], ascending=[False, True]))

Index名でソート (デフォルト=True)
df.sort_index(ascending=False)

データ取得

指定行、列表示

先頭5行表示
df.head()

先頭10行表示
df.head(10)

末尾5行表示
df.tail()

末尾10行表示
df.tail(10)

指定列のみ
df[[‘列1′,’列5’]].head(10)

列番号で指定
df[5:10].head(10)

指定行(全列)
※0から
df.loc[100]

指定行、指定列
df.iloc[[1,2,5][2,4]]
df.iloc[[行1,行2,行5][列2,列4]]

条件を指定
df[df[‘列名’] > 450]

複数条件を指定
df[[‘列名1’, ‘列名2’]].query(‘列名1 > ~ and 列名2 == “~”‘)

重複を削除して表示
df[‘列名’].unique()
array([‘値1’, ‘値2’, ‘値3’])

重複削除
result = df[‘列名’].drop_duplicates()

その他

JupyterNotebookカレントディレクトリ

import os

os.getcwd()
‘C:\\Users\\~\\Desktop’

ファイル操作

CSVファイルの読み込み

JupyterNotebookでuploadしたCSVファイルの読み込み
import pandas as pd

df= pd.read_csv(‘~.csv’)
df= pd.read_csv(‘~.csv’, sep=’,’)

CSVファイルの書き込み

import pandas as pd

pd.to_csv(
 ”ファイル名”,
 オプション(省略可)
 index=False, デフォルト=True
 header=False, デフォルト=True
 columns=[‘列1’, ‘列2’], デフォルト=全列
 encoding=”shift-jis”,
 mode=’x’ デフォルト=w(上書き)、x=上書き禁止、a=追記
)

Excelファイルの書き込み

Python OpenPyxl(Excel操作)」参照

DB処理

import pyodbc
import pandas as pd

例1
connect = pyodbc.connect(〜)
df = pd.read_sql(“select 〜”, connect)
df.to_csv(〜)
connect.close()

例2
connect = pyodbc.connect(〜)
cursor = connect.cursor()
cursor.execute(“select 〜”)

rows = cursor.fetchall()
df = pd.DataFrame(np.array(rows))
df.to_csv(〜)
cursor.close()
connect.close()

Python

前の記事

Python venv