データ解析用ライブラリPandasの入門シリーズです。
Pandasでは、excelやcsvなどからのデータの読み込みや解析、グラフの描画などが高速、かつ、効率的に行うことができます。
今回の入門編では、公式ページの10 minutes to pandasの流れに沿って動作を確認していきます。
Pandasのインストール
pip install pandas
ソースコードで、pandasモジュールを読み込みます。
import numpy as np
import pandas as pd
numpyとセットで使われることが多いので、numpyも一緒に読み込んでおきます。
pandasオブジェクトの作成
1次元配列オブジェクトの作成
a = pd.Series(
[1, 2, 3, 4, np.nan, 6, 7, 8, 9, 10]
)
print('a = ', a)
b = pd.date_range('20200609', periods=6)
print('b = ', b)
出力
a = 0 1.0
1 2.0
2 3.0
3 4.0
4 NaN
5 6.0
6 7.0
7 8.0
8 9.0
9 10.0
dtype: float64
b = DatetimeIndex(['2020-06-09', '2020-06-10', '2020-06-11', '2020-06-12', '2020-06-13', '2020-06-14'],
dtype='datetime64[ns]', freq='D')
pd.date_range()で日付型の要素を持った配列が生成できます。periods引数で、期間を設定しています。
2次元配列(テーブル型)の作成
c = pd.DataFrame(
np.random.randn(6, 4),
index = b,
columns = list('ABCD')
)
print('c = ', c)
d = pd.DataFrame(
{
'A': 1.0,
'B': pd.Timestamp('20200609'),
'C': pd.Series(
1,
index=list(range(4)),
dtype = 'float32'
),
'D': np.array(
[3] * 4,
dtype='int32'
),
'E': pd.Categorical(
['test', 'train', 'test', 'train']
),
'F': 'foo'
}
)
print('d = ', d)
出力
c = A B C D
2020-06-09 -0.568155 -0.208802 -0.038764 0.070417
2020-06-10 0.790197 1.750673 -1.204253 -1.203343
2020-06-11 0.159510 -1.481566 0.651237 -2.499592
2020-06-12 -0.840938 0.256012 -0.560881 1.917525
2020-06-13 -0.628798 -0.590094 -1.814191 0.607754
2020-06-14 -1.823898 -1.195555 -0.857130 0.403937
d = A B C D E F
0 1.0 2020-06-09 1.0 3 test foo
1 1.0 2020-06-09 1.0 3 train foo
2 1.0 2020-06-09 1.0 3 test foo
3 1.0 2020-06-09 1.0 3 train foo
indexが行ヘッダ、columnsが列ヘッダを表しています。
作成したデータの確認
データ型を調べる
print(d.dtypes)
出力
A float64
B datetime64[ns]
C float32
D int32
E category
F object
dtype: object
データの先頭部分、末尾部分を取得する
print(c.head())
print(c.tail())
print(c.tail(3))
出力
A B C D
2020-06-09 -1.148820 0.559512 -0.270844 -1.119315
2020-06-10 1.155711 -1.284437 -0.094978 -0.542046
2020-06-11 0.502422 -0.908783 0.865800 -0.239080
2020-06-12 -0.313514 0.716692 0.249746 0.143688
2020-06-13 -0.845227 -0.504853 0.234423 0.361580
A B C D
2020-06-10 1.155711 -1.284437 -0.094978 -0.542046
2020-06-11 0.502422 -0.908783 0.865800 -0.239080
2020-06-12 -0.313514 0.716692 0.249746 0.143688
2020-06-13 -0.845227 -0.504853 0.234423 0.361580
2020-06-14 0.370775 1.898906 -0.404837 -0.711529
A B C D
2020-06-12 -0.313514 0.716692 0.249746 0.143688
2020-06-13 -0.845227 -0.504853 0.234423 0.361580
2020-06-14 0.370775 1.898906 -0.404837 -0.711529
head()、tail()の引数に何行取り出すかを指定できます。
print(c.index)
print(c.columns)
出力
DatetimeIndex(['2020-06-09', '2020-06-10', '2020-06-11', '2020-06-12',
'2020-06-13', '2020-06-14'],
dtype='datetime64[ns]', freq='D')
Index(['A', 'B', 'C', 'D'], dtype='object')
インデックス情報、列情報を確認しています。
pd.DataFrameオブジェクトをnumpyのarrayオブジェクトに変換します。
c_to_numpy = c.to_numpy()
print(c_to_numpy)
出力
[[ 1.3945224 -2.16639648 0.57689592 1.48256738]
[ 1.29968647 -2.91909182 1.02403685 -0.31999603]
[-0.86927512 0.07877687 -1.58678064 0.1163637 ]
[-0.14015204 -0.7582679 -1.40456898 -0.79199917]
[ 1.58617336 -0.75270374 -0.39788265 0.94861466]
[-0.58671378 -2.53326774 -1.82278447 1.34084589]]
np.arrayオブジェクトに変換する際には、インデックス情報、列情報は残りません。
print(c.describe())
出力
A B C D
count 6.000000 6.000000 6.000000 6.000000
mean 0.147376 -0.296531 0.450643 0.177528
std 0.894601 0.922210 0.340619 0.725526
min -1.190921 -1.673923 -0.018152 -0.853745
25% -0.355276 -0.801286 0.269322 -0.039645
50% 0.229095 -0.194743 0.395687 0.017650
75% 0.834357 0.226281 0.738966 0.488701
max 1.130941 0.921070 0.850046 1.296637
describe()で統計情報を取得できます。
count(データの個数)、mean(平均)、std(標準偏差)、min(最小値)、25%(第1四分位数)、50%(中央値)、75%(第3四分位数)、max(最大値)となっています。
e = c.T
print('e = ', e)
出力
e = 2020-06-09 2020-06-10 2020-06-11 2020-06-12 2020-06-13 2020-06-14
A -1.698692 -1.049570 -1.300102 0.810853 0.632688 -0.861506
B -2.079725 -1.506159 0.862219 -0.892856 -0.845409 -0.809814
C -0.103235 0.785892 1.135647 -0.219564 -0.093387 -1.640137
D 1.260371 -1.172984 0.775742 1.100353 -0.592993 0.595317
Tメッソッドで、転置行列を取得できます。
print(c.sort_index(axis=1, ascending=False))
print(c.sort_index(axis=1, ascending=True))
print(c.sort_values(by='B'))
出力
D C B A
2020-06-09 1.260371 -0.103235 -2.079725 -1.698692
2020-06-10 -1.172984 0.785892 -1.506159 -1.049570
2020-06-11 0.775742 1.135647 0.862219 -1.300102
2020-06-12 1.100353 -0.219564 -0.892856 0.810853
2020-06-13 -0.592993 -0.093387 -0.845409 0.632688
2020-06-14 0.595317 -1.640137 -0.809814 -0.861506
A B C D
2020-06-09 -1.698692 -2.079725 -0.103235 1.260371
2020-06-10 -1.049570 -1.506159 0.785892 -1.172984
2020-06-11 -1.300102 0.862219 1.135647 0.775742
2020-06-12 0.810853 -0.892856 -0.219564 1.100353
2020-06-13 0.632688 -0.845409 -0.093387 -0.592993
2020-06-14 -0.861506 -0.809814 -1.640137 0.595317
A B C D
2020-06-09 -1.698692 -2.079725 -0.103235 1.260371
2020-06-10 -1.049570 -1.506159 0.785892 -1.172984
2020-06-12 0.810853 -0.892856 -0.219564 1.100353
2020-06-13 0.632688 -0.845409 -0.093387 -0.592993
2020-06-14 -0.861506 -0.809814 -1.640137 0.595317
2020-06-11 -1.300102 0.862219 1.135647 0.775742
特定の軸方向への並べ替えは、sort_index()で取得できます。
ascending引数が、Falseの場合は降順、Trueで昇順になります。
特例の列を基準にした並べ替えは、sort_value()で取得できます。
値の抽出
a = pd.date_range('20200609', periods=6)
print('a = ', a)
b = pd.DataFrame(
np.random.randn(6, 4),
index = a,
columns = list('ABCD')
)
print('b = ', b)
print("b['A'] = ", b['A'])
print('b[0:3] = ', b[0:3])
print("b['20200610': '20200612'] = ", b['20200610': '20200612'])
出力
a = DatetimeIndex(['2020-06-09', '2020-06-10', '2020-06-11', '2020-06-12',
'2020-06-13', '2020-06-14'],
dtype='datetime64[ns]', freq='D')
b = A B C D
2020-06-09 -0.232707 -0.734070 -0.304779 -0.636281
2020-06-10 2.044733 -0.783059 -0.298028 0.471809
2020-06-11 -0.631950 -0.400935 -0.902282 -0.249025
2020-06-12 2.198876 0.607541 -0.011687 -0.478565
2020-06-13 1.062989 -0.515174 0.260090 -0.596904
2020-06-14 -0.285998 1.158252 0.198043 -1.618806
b['A'] = 2020-06-09 -0.232707
2020-06-10 2.044733
2020-06-11 -0.631950
2020-06-12 2.198876
2020-06-13 1.062989
2020-06-14 -0.285998
Freq: D, Name: A, dtype: float64
b[0:3] = A B C D
2020-06-09 -0.232707 -0.734070 -0.304779 -0.636281
2020-06-10 2.044733 -0.783059 -0.298028 0.471809
2020-06-11 -0.631950 -0.400935 -0.902282 -0.249025
b['20200610': '20200612'] = A B C D
2020-06-10 2.044733 -0.783059 -0.298028 0.471809
2020-06-11 -0.631950 -0.400935 -0.902282 -0.249025
2020-06-12 2.198876 0.607541 -0.011687 -0.478565
ラベルの値で要素を抽出する
ラベルの値で要素を取得する場合は、locを使用します。
print("b.loc['20200613'] = ", b.loc['20200613'])
print("b.loc['20200613', 'A'] = ", b.loc['20200613', 'A'])
print("b.loc['20200613']['A'] = ", b.loc['20200613']['A'])
print("b.loc['20200613', ['A', 'B]] = ", b.loc['20200613', ['A', 'B']])
print("b.loc[:, ['A', 'B']] = ", b.loc[:, ['A', 'B']])
print("b.loc['20200611':'20200613', ['A', 'B']] = ", b.loc['20200611' : '20200613', ['A', 'B']])
print("b.at['20200613', 'A'] = ", b.at['20200613', 'A'])
出力
b.loc['20200613'] = A 1.062989
B -0.515174
C 0.260090
D -0.596904
Name: 2020-06-13 00:00:00, dtype: float64
b.loc['20200613', 'A'] = 1.0629888632784765
b.loc['20200613']['A'] = 1.0629888632784765
b.loc['20200613', ['A', 'B]] = A 1.062989
B -0.515174
Name: 2020-06-13 00:00:00, dtype: float64
b.loc[:, ['A', 'B']] = A B
2020-06-09 -0.232707 -0.734070
2020-06-10 2.044733 -0.783059
2020-06-11 -0.631950 -0.400935
2020-06-12 2.198876 0.607541
2020-06-13 1.062989 -0.515174
2020-06-14 -0.285998 1.158252
b.loc['20200611':'20200613', ['A', 'B']] = A B
2020-06-11 -0.631950 -0.400935
2020-06-12 2.198876 0.607541
2020-06-13 1.062989 -0.515174
b.at['20200613', 'A'] = 1.0629888632784765
スカラー値を取得する場合(特定の1つの要素)、atを使うと処理が速くなります。
位置で要素を取得する
位置から要素を取得する場合は、ilocを使用します。
print("b.iloc[3] = ", b.iloc[3])
print("b.iloc[3:5, 0:2] = ", b.iloc[3:5, 0:2])
print("b.iloc[[1, 2, 4], [0, 2]] = ", b.iloc[[1, 2, 4], [0, 2]])
print("b.iloc[1:3, :] = ", b.iloc[1:3, :])
print("b.iloc[:, 1:3] = ", b.iloc[:, 1:3])
print("b.iloc[1, 1] = ", b.iloc[1, 1])
print("b.iat[1, 1] = ", b.iat[1, 1])
出力
b.iloc[3] = A 2.198876
B 0.607541
C -0.011687
D -0.478565
Name: 2020-06-12 00:00:00, dtype: float64
b.iloc[3:5, 0:2] = A B
2020-06-12 2.198876 0.607541
2020-06-13 1.062989 -0.515174
b.iloc[[1, 2, 4], [0, 2]] = A C
2020-06-10 2.044733 -0.298028
2020-06-11 -0.631950 -0.902282
2020-06-13 1.062989 0.260090
b.iloc[1:3, :] = A B C D
2020-06-10 2.044733 -0.783059 -0.298028 0.471809
2020-06-11 -0.631950 -0.400935 -0.902282 -0.249025
b.iloc[:, 1:3] = B C
2020-06-09 -0.734070 -0.304779
2020-06-10 -0.783059 -0.298028
2020-06-11 -0.400935 -0.902282
2020-06-12 0.607541 -0.011687
2020-06-13 -0.515174 0.260090
2020-06-14 1.158252 0.198043
b.iloc[1, 1] = -0.7830591937688992
b.iat[1, 1] = -0.7830591937688992
スカラー値を取得する場合(特定の1つの要素)、iatを使うと処理が速くなります。
条件を指定して要素を取得する
print("b[b['A'] > 0] = ", b[b['A'] > 0])
print("b[b > 0] = ", b[b > 0])
b['E'] = ['one', 'one', 'two', 'three', 'four', 'three']
print('b = ', b)
print("b[b['E'].isin(['two', 'three'])] = ", b[b['E'].isin(['two', 'three'])])
出力
b[b['A'] > 0] = A B C D
2020-06-10 2.044733 -0.783059 -0.298028 0.471809
2020-06-12 2.198876 0.607541 -0.011687 -0.478565
2020-06-13 1.062989 -0.515174 0.260090 -0.596904
b[b > 0] = A B C D
2020-06-09 NaN NaN NaN NaN
2020-06-10 2.044733 NaN NaN 0.471809
2020-06-11 NaN NaN NaN NaN
2020-06-12 2.198876 0.607541 NaN NaN
2020-06-13 1.062989 NaN 0.260090 NaN
2020-06-14 NaN 1.158252 0.198043 NaN
b = A B C D E
2020-06-09 -0.232707 -0.734070 -0.304779 -0.636281 one
2020-06-10 2.044733 -0.783059 -0.298028 0.471809 one
2020-06-11 -0.631950 -0.400935 -0.902282 -0.249025 two
2020-06-12 2.198876 0.607541 -0.011687 -0.478565 three
2020-06-13 1.062989 -0.515174 0.260090 -0.596904 four
2020-06-14 -0.285998 1.158252 0.198043 -1.618806 three
b[b['E'].isin(['two', 'three'])] = A B C D E
2020-06-11 -0.631950 -0.400935 -0.902282 -0.249025 two
2020-06-12 2.198876 0.607541 -0.011687 -0.478565 three
2020-06-14 -0.285998 1.158252 0.198043 -1.618806 three
isin()で、特定の値を持つ要素を抽出できます。
要素を追加、設定する
a = pd.date_range('20200609', periods=6)
print('a = ', a)
b = pd.DataFrame(
np.random.randn(6, 4),
index = a,
columns = list('ABCD')
)
print('b = ', b)
s1 = pd.Series(
[1, 2, 3, 4, 5, 6],
index=pd.date_range('20200609', periods=6)
)
print('s1 = ', s1)
# E列を追加します。
b['E'] = s1
print('b = ', b)
# ラベルの値で指定した要素に値を設定します。
b.at['20200609', 'A'] = 0
print('b = ', b)
# 位置で指定した要素に値を設定します。
b.iat[0, 1] = 0
print('b = ', b)
# D列にnumpyオブジェクトを設定します。
b.loc[:, 'D'] = np.array(
[5] * len(b)
)
print('b = ', b)
# 0より大きい要素の値をマイナスにします。
b[b > 0] = -b
print('b = ', b)
出力
a = DatetimeIndex(['2020-06-09', '2020-06-10', '2020-06-11', '2020-06-12',
'2020-06-13', '2020-06-14'],
dtype='datetime64[ns]', freq='D')
b = A B C D
2020-06-09 0.199733 0.785209 -0.611686 -1.810060
2020-06-10 0.361514 -0.875324 0.926422 -0.587748
2020-06-11 -2.602176 -1.414534 -1.073530 -0.205837
2020-06-12 -1.457585 1.267296 0.102020 0.568383
2020-06-13 1.359036 1.101441 3.051888 0.146906
2020-06-14 0.118157 0.044420 0.874629 -1.698749
s1 = 2020-06-09 1
2020-06-10 2
2020-06-11 3
2020-06-12 4
2020-06-13 5
2020-06-14 6
Freq: D, dtype: int64
b = A B C D E
2020-06-09 0.199733 0.785209 -0.611686 -1.810060 1
2020-06-10 0.361514 -0.875324 0.926422 -0.587748 2
2020-06-11 -2.602176 -1.414534 -1.073530 -0.205837 3
2020-06-12 -1.457585 1.267296 0.102020 0.568383 4
2020-06-13 1.359036 1.101441 3.051888 0.146906 5
2020-06-14 0.118157 0.044420 0.874629 -1.698749 6
b = A B C D E
2020-06-09 0.000000 0.785209 -0.611686 -1.810060 1
2020-06-10 0.361514 -0.875324 0.926422 -0.587748 2
2020-06-11 -2.602176 -1.414534 -1.073530 -0.205837 3
2020-06-12 -1.457585 1.267296 0.102020 0.568383 4
2020-06-13 1.359036 1.101441 3.051888 0.146906 5
2020-06-14 0.118157 0.044420 0.874629 -1.698749 6
b = A B C D E
2020-06-09 0.000000 0.000000 -0.611686 -1.810060 1
2020-06-10 0.361514 -0.875324 0.926422 -0.587748 2
2020-06-11 -2.602176 -1.414534 -1.073530 -0.205837 3
2020-06-12 -1.457585 1.267296 0.102020 0.568383 4
2020-06-13 1.359036 1.101441 3.051888 0.146906 5
2020-06-14 0.118157 0.044420 0.874629 -1.698749 6
b = A B C D E
2020-06-09 0.000000 0.000000 -0.611686 5 1
2020-06-10 0.361514 -0.875324 0.926422 5 2
2020-06-11 -2.602176 -1.414534 -1.073530 5 3
2020-06-12 -1.457585 1.267296 0.102020 5 4
2020-06-13 1.359036 1.101441 3.051888 5 5
2020-06-14 0.118157 0.044420 0.874629 5 6
b = A B C D E
2020-06-09 0.000000 0.000000 -0.611686 -5 -1
2020-06-10 -0.361514 -0.875324 -0.926422 -5 -2
2020-06-11 -2.602176 -1.414534 -1.073530 -5 -3
2020-06-12 -1.457585 -1.267296 -0.102020 -5 -4
2020-06-13 -1.359036 -1.101441 -3.051888 -5 -5
2020-06-14 -0.118157 -0.044420 -0.874629 -5 -6
欠落した要素
欠落した要素、つまり、値が指定されていない要素を扱う方法を見てみます。
a = pd.date_range('20200609', periods=6)
print('a = ', a)
b = pd.DataFrame(
np.random.randn(6, 4),
index = a,
columns = list('ABCD')
)
print('b = ', b)
s1 = pd.Series(
[1, 2, 3, 4, 5, 6],
index=pd.date_range('20200610', periods=6)
)
print('s1 = ', s1)
b['E'] = s1
print('b = ', b)
c = b.reindex(
index=a[0:4],
columns = list(b.columns) + ['F']
)
c.loc['20200609':'20200611', 'F'] = 1
print('c = ', c)
print(c.dropna(how='any'))
print(c.fillna(value=5))
print(pd.isna(c))
※E列の要素は、インデックスの日付がbオブジェクトと一つずれていることに注意してください。
出力
a = DatetimeIndex(['2020-06-09', '2020-06-10', '2020-06-11', '2020-06-12',
'2020-06-13', '2020-06-14'],
dtype='datetime64[ns]', freq='D')
b = A B C D
2020-06-09 -0.975228 -0.841940 -0.871876 0.265753
2020-06-10 -0.276629 -1.263136 1.010993 1.422562
2020-06-11 0.600269 0.560677 1.177760 1.404408
2020-06-12 0.779037 1.041018 -0.052188 -2.650628
2020-06-13 -0.411858 2.517579 -0.821479 0.086033
2020-06-14 -2.162505 0.036031 -1.077481 1.033002
s1 = 2020-06-10 1
2020-06-11 2
2020-06-12 3
2020-06-13 4
2020-06-14 5
2020-06-15 6
Freq: D, dtype: int64
b = A B C D E
2020-06-09 -0.975228 -0.841940 -0.871876 0.265753 NaN
2020-06-10 -0.276629 -1.263136 1.010993 1.422562 1.0
2020-06-11 0.600269 0.560677 1.177760 1.404408 2.0
2020-06-12 0.779037 1.041018 -0.052188 -2.650628 3.0
2020-06-13 -0.411858 2.517579 -0.821479 0.086033 4.0
2020-06-14 -2.162505 0.036031 -1.077481 1.033002 5.0
c = A B C D E F
2020-06-09 -0.975228 -0.841940 -0.871876 0.265753 NaN 1.0
2020-06-10 -0.276629 -1.263136 1.010993 1.422562 1.0 1.0
2020-06-11 0.600269 0.560677 1.177760 1.404408 2.0 1.0
2020-06-12 0.779037 1.041018 -0.052188 -2.650628 3.0 NaN
A B C D E F
2020-06-10 -0.276629 -1.263136 1.010993 1.422562 1.0 1.0
2020-06-11 0.600269 0.560677 1.177760 1.404408 2.0 1.0
A B C D E F
2020-06-09 -0.975228 -0.841940 -0.871876 0.265753 5.0 1.0
2020-06-10 -0.276629 -1.263136 1.010993 1.422562 1.0 1.0
2020-06-11 0.600269 0.560677 1.177760 1.404408 2.0 1.0
2020-06-12 0.779037 1.041018 -0.052188 -2.650628 3.0 5.0
A B C D E F
2020-06-09 False False False False True False
2020-06-10 False False False False False False
2020-06-11 False False False False False False
2020-06-12 False False False False False True
dropna()で、NaNを含む行を削除しています。
fillna()で、NaN要素に値を設定しています。
pd.isna()で、NaNか否かをBoolean値で返しています。
今回は、ここまでにして次回10分Pandasの後半部分を見ていきます。
コメント