今日はかずまなぶです。
Python でデータを処理するときにベクトルだったり行列だったり使うわけですが、じゃあどれを使ったらいいのかって迷ったことありませんか?私はいつも迷ってます。
そんな毎日に終止符を打つべく今回はしっかりと、まとめていきたいと思います。
私たちの選択肢は,
- list (Python標準の組み込み型 インポート不要)
- array.array (Pythonの標準モジュール)
- numpy.array (数値計算ライブラリ NumPy。行列演算)
- pandas.Series (データベース分析ライブラリPandas。ベクトル)
- pandas.DataFrame(データベース分析ライブラリPandas。行列)
list
まずは、listを確認しましょう。
# listの使い方 | |
li_1d = [1,2,3,4] # ベクトルっぽく | |
li_2d = [ [1,2,3] , [4,5,6] , [7,8,9] ] #行列っぽく | |
# 取り出し方 | |
li_1d[1] # 2 | |
li_2d[1][2] # 6 | |
# 演算は期待できない | |
li_1d + li_1d # [1, 2, 3, 4, 1, 2, 3, 4] | |
li_2d + li_2d # [[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 2, 3], [4, 5, 6], [7, 8, 9]] | |
# max() , min() ,sum() , len() はよく使う | |
max(li_1d) # 4 | |
min(li_1d) # 1 | |
sum(li_1d) # 10 | |
len(li_1d) # 4 | |
# for文のシーケンスとしてよく使う | |
li_str = ["a","b","c"] | |
for s in li_str: | |
print(s) | |
# a | |
# b | |
# c |
カンタンにデータの入れ物をつくるならlistは便利ですね。最も輝かしい使い方は、
for構文のインデックス番号として
使われることだと思います。
こんな応用もあります。よく使います。(zip , enumrate)
array.array
では次の、arrayモジュールの array.arrayを確認しましょう。
# arrayモジュールの使い方 | |
import array as ar | |
#型指定が必要 | |
#ベクトルしか表現できない | |
ar_int = ar.array("i",[1 , 2 , 3 , 4 ]) # 中身をint型で指定 | |
ar_float = ar.array("f",[1.0 , 2.0 , 3.0 , 4.0]) # 中身をfloat型で指定 | |
type(ar_int) #array.array型 | |
type(ar_float) #array.array型 | |
# 基本的にlistと同じ | |
ar_int[1] # 2 | |
ar_int+ar_int # array('i', [1, 2, 3, 4, 1, 2, 3, 4]) | |
max(ar_int) # 4 | |
min(ar_int) # 1 | |
sum(ar_int) # 10 | |
len(ar_int) # 4 |
結論として、これは使う必要はありませんね。忘れましょう。
numpy.array
ここからが本番、numpy.array です。
行列演算をするなら
これで決まり。
import numpy as np | |
ar_1d=np.array( [1,2,3] ) # array([1, 2, 3]) | |
ar_2d=np.array( [ [1,2,3],[4,5,6] ] ) # array([[1, 2, 3],[4, 5, 6]]) | |
type(ar_1d) #numpy.ndarray | |
ar_3d=np.array( [ [ [1,2,3],[4,5,6] ],[ [1,2,3],[4,5,6] ] ] ) # 3次元配列も可能 | |
# 行列演算 | |
ar_1=np.array([1,2,3]) | |
ar_2=np.array([4,5,6]) | |
sumation=ar_1 + ar_2 # 和算 array([5, 7, 9]) | |
product=np.dot(ar_1,ar_2) # 内積 32 | |
ar_3=np.array([[1,2],[3,4]]) | |
ar_4=np.array([[5,6,7],[8,9,10]]) | |
product=np.dot(ar_3,ar_4) # 内積 array([[21, 24, 27],[47, 54, 61]]) |
pandas.DataFrame
いよいよpandasです。pandas.Seriesはぶっちゃけ要らないです。なので飛ばして、pandas.DataFrameを確認しましょう。データの取り込み、表計算やSQLのような使い勝手です。時系列処理、文字列と数値が混ざっているデータでも処理できます。データの欠損があっても取り込めますし、除去することもできます。
まさに、データベース分析ライブラリ。
# pandasでデータを取り込む# pandasでデータを取り込む | |
import pandas as pd | |
#まずはcsvファイルからカンマ区切り読み込む。 | |
df=pd.read_csv("c:\\MyPythonScripts\\data\\sample_data.csv",index_col=0) # index_col=0 インデックスの列をオフにする | |
# name stage1 stage2 stage3 stage4 | |
# Alice 24 45 64 54 | |
# Bob 42 45 89 48 | |
# Char 18 70 78 98 | |
# Dave 68 89 25 49 | |
df # pandas.core.frame.DataFrame | |
df.index # Index(['Alice', 'Bob', 'Char', 'Dave'], dtype='object', name='name') | |
df.keys()# Index(['stage1', 'stage2', 'stage3', 'stage4'], dtype='object') | |
# データの取り出す | |
df["stage3"] # 列 column を取り出す | |
# name | |
# Alice 64 | |
# Bob 89 | |
# Char 78 | |
# Dave 25 | |
# Name: stage3, dtype: int64 | |
# かんたんな計算をする | |
df2=df["stage3"] + df["stage4"] | |
#name | |
#Alice 118 | |
#Bob 137 | |
#3Char 176 | |
#Dave 74 | |
# dtype: int64 | |
#グラフを見る | |
import matplotlib.pyplot as plt | |
df.plot() | |
plt.show() | |
# データを変換する | |
li=list(df["stage3"]) # リストに変換 :[64, 89, 78, 25] | |
import numpy as np | |
ar=np.array(df["stage3"]) # np.ndarrayに変換 :array([64, 89, 78, 25], dtype=int64) | |
# データをpandas.DataFrame に再変換する。 | |
df_li=pd.DataFrame(li) # pandas.core.frame.DataFrame | |
df_ar=pd.DataFrame(ar) # pandas.core.frame.DataFrame | |
# name stage1 stage2 stage3 stage4 | |
# Alice 24 45 64 54 | |
# Bob 42 45 89 48 | |
# Char 18 70 78 98 | |
# Dave 68 89 25 49 | |
df.index # Index(['Alice', 'Bob', 'Char', 'Dave'], dtype='object', name='name') | |
df.keys()# Index(['stage1', 'stage2', 'stage3', 'stage4'], dtype='object') | |
# データの取り出す | |
df["stage3"] # 列 column を取り出す | |
# name | |
# Alice 64 | |
# Bob 89 | |
# Char 78 | |
# Dave 25 | |
# Name: stage3, dtype: int64 | |
# かんたんな計算をする | |
df2=df["stage3"] + df["stage4"] | |
#name | |
#Alice 118 | |
#Bob 137 | |
#3Char 176 | |
#Dave 74 | |
# dtype: int64 | |
#グラフを見る | |
import matplotlib.pyplot as plt | |
df.plot() | |
plt.show() | |
# データを変換する | |
li=list(df["stage3"]) # リストに変換 :[64, 89, 78, 25] | |
import numpy as np | |
ar=np.array(df["stage3"]) # np.ndarrayに変換 :array([64, 89, 78, 25], dtype=int64) | |
# データをpandas.DataFrame に再変換する。 | |
df_li=pd.DataFrame(li) # pandas.core.frame.DataFrame | |
df_ar=pd.DataFrame(ar) # pandas.core.frame.DataFrame |

pandas.DataFrameはデータの取り込みと成形は得意ですが、演算はそれほどではなさそうです。演算はnumpy.narrayに任せましょう。
まとめ
- それぞれの得意分野を明らかにしました。
- array.array と pandas.Series の存在は忘れましょう。
- データの操作は、以下のような順番が良いと考えます。
- pandas.read_csv(“ファイル名.csv”,index_col=0) でデータフレームとして取り込む。
- pandasでデータフレームを成形する。
- データフレームからnumpy.arrayに変換して、演算する。
- 結果を再びpandasのデータフレームに変換する。
本日も最後まで見ていただきまして誠にありがとうございます。
(‘ω’)かず まなぶ
次回からは、取り込んだデータを整形するというテーマでpandas.DataFrameを深掘りしていきましょう。