pandasとは??
データ処理を効率化する機能を提供するライブラリです
DataFrame pandasはデータを DataFrame という形式に変換してプログラムを書いていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import pandas import numpy numpy.random.seed(42) # 10行5列の配列(要素は乱数)を作る data = numpy.random.randn(10, 5) print(data) #出力: [[ 0.49671415 -0.1382643 0.64768854 1.52302986 -0.23415337] [-0.23413696 1.57921282 0.76743473 -0.46947439 0.54256004] [-0.46341769 -0.46572975 0.24196227 -1.91328024 -1.72491783] [-0.56228753 -1.01283112 0.31424733 -0.90802408 -1.4123037 ] [ 1.46564877 -0.2257763 0.0675282 -1.42474819 -0.54438272] [ 0.11092259 -1.15099358 0.37569802 -0.60063869 -0.29169375] [-0.60170661 1.85227818 -0.01349722 -1.05771093 0.82254491] [-1.22084365 0.2088636 -1.95967012 -1.32818605 0.19686124] [ 0.73846658 0.17136828 -0.11564828 -0.3011037 -1.47852199] [-0.71984421 -0.46063877 1.05712223 0.34361829 -1.76304016]] # dataを要素とするDataFrameを作る df = pandas.DataFrame(data, columns=['A', 'B', 'C', 'D', 'E']) print(df) #出力 A B C D E 0 0.496714 -0.138264 0.647689 1.523030 -0.234153 1 -0.234137 1.579213 0.767435 -0.469474 0.542560 2 -0.463418 -0.465730 0.241962 -1.913280 -1.724918 3 -0.562288 -1.012831 0.314247 -0.908024 -1.412304 4 1.465649 -0.225776 0.067528 -1.424748 -0.544383 5 0.110923 -1.150994 0.375698 -0.600639 -0.291694 6 -0.601707 1.852278 -0.013497 -1.057711 0.822545 7 -1.220844 0.208864 -1.959670 -1.328186 0.196861 8 0.738467 0.171368 -0.115648 -0.301104 -1.478522 9 -0.719844 -0.460639 1.057122 0.343618 -1.763040 |
DataFrame の基本的な操作
取得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 先頭3行を取得する print(df.head(3)) #出力: A B C D E 0 0.496714 -0.138264 0.647689 1.523030 -0.234153 1 -0.234137 1.579213 0.767435 -0.469474 0.542560 2 -0.463418 -0.465730 0.241962 -1.913280 -1.724918 # 後尾3行を取得する print(df.tail(3)) #出力: A B C D E 7 -1.220844 0.208864 -1.959670 -1.328186 0.196861 8 0.738467 0.171368 -0.115648 -0.301104 -1.478522 9 -0.719844 -0.460639 1.057122 0.343618 -1.763040 |
index 属性
DataFrame の行インデックスです。
1 2 3 |
print(df.index) #出力: RangeIndex(start=0, stop=10, step=1) |
今回の例では、0から9の数字(DataFrame を表示したときの一番左の列)が RangeIndex というクラスのインスタンスで表現されています。 columns 属性は列のカラム名を取得します(DataFrame を表示したときの一番上の行)
1 2 3 |
print(df.columns) 出力: Index(['A', 'B', 'C', 'D', 'E'], dtype='object') |
values 属性
DataFrame のデータ部分を取得します。
1 2 3 4 5 6 7 8 9 10 11 12 |
print(df.values) 出力: [[ 0.49671415 -0.1382643 0.64768854 1.52302986 -0.23415337] [-0.23413696 1.57921282 0.76743473 -0.46947439 0.54256004] [-0.46341769 -0.46572975 0.24196227 -1.91328024 -1.72491783] [-0.56228753 -1.01283112 0.31424733 -0.90802408 -1.4123037 ] [ 1.46564877 -0.2257763 0.0675282 -1.42474819 -0.54438272] [ 0.11092259 -1.15099358 0.37569802 -0.60063869 -0.29169375] [-0.60170661 1.85227818 -0.01349722 -1.05771093 0.82254491] [-1.22084365 0.2088636 -1.95967012 -1.32818605 0.19686124] [ 0.73846658 0.17136828 -0.11564828 -0.3011037 -1.47852199] [-0.71984421 -0.46063877 1.05712223 0.34361829 -1.76304016]] |
統計情報
describe() メソッドはいくつか有名な統計情報(最大値、最小値、平均など)を計算します。
1 2 3 4 5 6 7 8 9 10 11 |
print(df.describe()) 出力: A B C D E count 10.000000 10.000000 10.000000 10.000000 10.000000 mean -0.099048 0.035749 0.138287 -0.613652 -0.588705 std 0.803521 0.990783 0.822706 0.985547 0.957109 min -1.220844 -1.150994 -1.959670 -1.913280 -1.763040 25% -0.591852 -0.464457 0.006759 -1.260567 -1.461967 50% -0.348777 -0.182020 0.278105 -0.754331 -0.418038 75% 0.400266 0.199490 0.579691 -0.343196 0.089108 max 1.465649 1.852278 1.057122 1.523030 0.822545 |
選択
ある1つのカラムを取得するときは角括弧 [] を利用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
print(df['C']) 出力: 0 0.647689 1 0.767435 2 0.241962 3 0.314247 4 0.067528 5 0.375698 6 -0.013497 7 -1.959670 8 -0.115648 9 1.057122 Name: C, dtype: float64 |
角括弧 [] にスライスを指定すると行の取得ができます。
1 2 3 4 5 6 7 8 |
# 2行目から5行目を取得する print(df[1:5]) 出力: A B C D E 1 -0.234137 1.579213 0.767435 -0.469474 0.542560 2 -0.463418 -0.465730 0.241962 -1.913280 -1.724918 3 -0.562288 -1.012831 0.314247 -0.908024 -1.412304 4 1.465649 -0.225776 0.067528 -1.424748 -0.544383 |
locプロバティ
複数のカラム名(ラベル)を指定して選択する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# A, B, Eの全行を取得する print(df.loc[:, ['A', 'B', 'E']]) 出力: A B E 0 0.496714 -0.138264 -0.234153 1 -0.234137 1.579213 0.542560 2 -0.463418 -0.465730 -1.724918 3 -0.562288 -1.012831 -1.412304 4 1.465649 -0.225776 -0.544383 5 0.110923 -1.150994 -0.291694 6 -0.601707 1.852278 0.822545 7 -1.220844 0.208864 0.196861 8 0.738467 0.171368 -1.478522 9 -0.719844 -0.460639 -1.763040 |
1 2 3 4 5 6 7 8 |
# A, B, Eの2から5行目を取得する print(df.loc[1:4, ['A', 'B', 'E']]) 出力: A B E 1 -0.234137 1.579213 0.542560 2 -0.463418 -0.465730 -1.724918 3 -0.562288 -1.012831 -1.412304 4 1.465649 -0.225776 -0.544383 |
Pythonのリストでは [start:end] と指定したときに end が含まれませんでしたが、loc プロパティのスライスには end が含まれます。
iloc プロパティ
行と列の位置を指定して選択します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 4行目 print(df.iloc[3]) 出力: A -0.562288 B -1.012831 C 0.314247 D -0.908024 E -1.412304 Name: 3, dtype: float64 # 2から3行目、2から3列目 print(df.iloc[1:3, 1:3]) 出力: B C 1 1.579213 0.767435 2 -0.465730 0.241962 |
iloc プロパティに与えるスライスは end が含まれない
Boolean Indexing ある条件を満たす行や列を取得する方法を見ていきます。 NumPyの節で mask を作ったのと同様に、DataFrameにも mask を与えることができます。 例えば、A列が0以上の行だけを取り出すときは以下のようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
mask = (df['A'] >= 0) print(mask) 出力: 0 True 1 False 2 False 3 False 4 True 5 True 6 False 7 False 8 True 9 False Name: A, dtype: bool print(df[mask]) 出力: A B C D E 0 0.496714 -0.138264 0.647689 1.523030 -0.234153 4 1.465649 -0.225776 0.067528 -1.424748 -0.544383 5 0.110923 -1.150994 0.375698 -0.600639 -0.291694 8 0.738467 0.171368 -0.115648 -0.301104 -1.478522 print(df[df['A'] >= 0]) 出力: A B C D E 0 0.496714 -0.138264 0.647689 1.523030 -0.234153 4 1.465649 -0.225776 0.067528 -1.424748 -0.544383 5 0.110923 -1.150994 0.375698 -0.600639 -0.291694 8 0.738467 0.171368 -0.115648 -0.301104 -1.478522 #角括弧 [] の中に条件を書くことで指定できます。 そして、条件を満たさない要素には NaN という値が入ります。 print(df[df >= 0]) 出力: A B C D E 0 0.496714 NaN 0.647689 1.523030 NaN 1 NaN 1.579213 0.767435 NaN 0.542560 2 NaN NaN 0.241962 NaN NaN 3 NaN NaN 0.314247 NaN NaN 4 1.465649 NaN 0.067528 NaN NaN 5 0.110923 NaN 0.375698 NaN NaN 6 NaN 1.852278 NaN NaN 0.822545 7 NaN 0.208864 NaN NaN 0.196861 8 0.738467 0.171368 NaN NaN NaN 9 NaN NaN 1.057122 0.343618 NaN |
統計操作
平均を求める
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
print(df.mean()) 出力 : A -0.099048 B 0.035749 C 0.138287 D -0.613652 E -0.588705 dtype: float64 #axis をパラメータとして与えることで平均を取る方向を指定することができます。 print(df.mean(axis=1)) 出力 : 0 0.459003 1 0.437119 2 -0.865077 3 -0.716240 4 -0.132346 5 -0.311341 6 0.200382 7 -0.820595 8 -0.197088 9 -0.308557 dtype: float64 |
和を求める
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#sum() メソッドは和を求めます。 print(df.sum()) 出力 : A -0.990485 B 0.357489 C 1.382866 D -6.136518 E -5.887047 dtype: float64 #sum() メソッドも axis を与えることで和を求める方向を指定することができます。 print(df.sum(axis=1)) 出力 : 0 2.295015 1 2.185596 2 -4.325383 3 -3.581199 4 -0.661730 5 -1.556705 6 1.001908 7 -4.102975 8 -0.985439 9 -1.542783 dtype: float64 |