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ファイルの書き込み
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()