python

【python】pandas

pandasとは??

データ処理を効率化する機能を提供するライブラリです

DataFrame pandasはデータを DataFrame という形式に変換してプログラムを書いていきます。

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 の基本的な操作

取得

# 先頭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 の行インデックスです。

print(df.index)
#出力:
RangeIndex(start=0, stop=10, step=1)

今回の例では、0から9の数字(DataFrame を表示したときの一番左の列)が RangeIndex というクラスのインスタンスで表現されています。 columns 属性は列のカラム名を取得します(DataFrame を表示したときの一番上の行)

print(df.columns)
出力:
Index(['A', 'B', 'C', 'D', 'E'], dtype='object')
values 属性

DataFrame のデータ部分を取得します。

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() メソッドはいくつか有名な統計情報(最大値、最小値、平均など)を計算します。

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つのカラムを取得するときは角括弧 [] を利用します。

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

角括弧 [] にスライスを指定すると行の取得ができます。

# 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プロバティ
複数のカラム名(ラベル)を指定して選択する
# 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
# 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 プロパティ

行と列の位置を指定して選択します。

# 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以上の行だけを取り出すときは以下のようにします。

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

統計操作

平均を求める
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
和を求める
#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