圧倒的使い分け:pythonのlist , array , numpy.array , pandas.Seriese , pandas.DataFrame

今日はかずまなぶです。

Python でデータを処理するときにベクトルだったり行列だったり使うわけですが、じゃあどれを使ったらいいのかって迷ったことありませんか?私はいつも迷ってます。

そんな毎日に終止符を打つべく今回はしっかりと、まとめていきたいと思います。

私たちの選択肢は,

  1. list                             (Python標準の組み込み型 インポート不要)
  2. array.array              (Pythonの標準モジュール)
  3. numpy.array           (数値計算ライブラリ NumPy。行列演算)
  4. pandas.Series          (データベース分析ライブラリPandas。ベクトル)
  5. 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 の存在は忘れましょう。
  • データの操作は、以下のような順番が良いと考えます。
  1. pandas.read_csv(“ファイル名.csv”,index_col=0) でデータフレームとして取り込む。
  2. pandasでデータフレームを成形する。
  3. データフレームからnumpy.arrayに変換して、演算する。
  4. 結果を再びpandasのデータフレームに変換する。

本日も最後まで見ていただきまして誠にありがとうございます。

(‘ω’)かず まなぶ

次回からは、取り込んだデータを整形するというテーマでpandas.DataFrameを深掘りしていきましょう。