Pandas⑦ (散布図)

散布図

前回記事で読み込んだCSVファイルのデータを散布図で表示します。

グラフ作成のライブラリである matplotlib を使います。

Google Colaboratory (Jupyter notebook) でグラフを表示するために %matplotlib inline と宣言しています。(3行目)

この宣言によりソースコードの実行結果としてグラフを表示することができるようになります。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# インポートとinlineの宣言
from matplotlib import pyplot as plt
%matplotlib inline

# CSVファイルの読み込み
df = pd.read_csv('data1.csv')

散布図の描画
plt.plot(df['最高気温'], # x軸は気温
df['売上数'], # y軸は売上数
'o' # ドットをプロット
)
plt.xlabel('temperature') # x軸ラベル
plt.ylabel('sales') # y軸ラベル

matplotlib.pyplot.plot関数 を使うとデフォルトで 折れ線グラフ を描画することができます。

第3引数に‘o’を指定することにより 散布図 で描画することができます。

[実行結果]

気温と売上の 散布図 を表示することができました。

Pandas⑥ (データフレーム/CSVファイル読み込み)

CSVファイルをデータフレームに読み込み

Pandas には、表形式のデータを DataFrameオブジェクト として読み込むための関数があります。

関数 内容
read_csv() カンマ区切りのファイルを読み込む。
read_table() タブ区切りのファイルを読み込む。

read_csvread_table は、データの区切り文字が異なるだけで、内部では同じ処理を使っています。

パフォーマンスに差はなく、引数の指定方法も同じです。

サンプルソース

CSVファイルデータフレームに読み込むサンプルソースは次の通りです。

[Google Colaboratory]

1
2
3
4
5
import pandas as pd

df = pd.read_csv("data.csv")

print(df) # データフレームを出力

読み込むCSVファイルは以下の通りです。

30日間の最高気温とその日の売上数がまとめられています。

data.csv (文字コードUTF-8)
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
最高気温,売上数
26,84
25,61
26,85
24,63
25,71
24,81
26,98
26,101
25,93
27,118
27,114
26,124
28,156
28,188
27,184
28,213
29,241
29,233
29,207
31,267
31,332
29,266
32,334
33,346
34,359
33,361
34,372
35,368
32,378
34,394

[実行結果]

CSVファイルデータフレームに読み込むことができました。

read_csv、read_tableのオプション

read_csvread_tableの主なオプションは以下の通りです。

オプション 内容
filepath_or_buffer 読み込み元のファイルパス、またはURLを指定。
sep 区切り文字。read_csvはデフォルトで ‘,’、read_tableはデフォルトで ‘\t’
delimiter sep の代わりに delimiter 引数でも区切り文字を指定可能。
デフォルトは None。
header ヘッダー行の行数を整数で指定。
デフォルトは ‘infer’。
names ヘッダー行をリストで指定。
デフォルトは None。
index_col 行のインデックスに用いる列番号。
デフォルトは None。
dtype 各列のデータ型。デフォルトは None。
例:{‘a’:np.float64, ‘b’:np.int32}
skiprows 先頭から読み込みをスキップする行数。
デフォルトは None。
skipfooter 末尾から読み込みをスキップする行数。
デフォルトは None。
nrows 読み込む行数。
デフォルトは None。
quotechar ダブルクォートなどでクォートされている場合のクォート文字。
デフォルトは ‘“‘
escapechar エスケープされている場合のエスケープ文字。
デフォルトは None。
comment コメント行の行頭文字を指定。指定した文字で始まる行は無視される。
デフォルトは None。
encoding 文字コード。’utf-8’、’cp932’、’shift_jis’、’euc_jp’などを指定。
デフォルトは None。

Pandas⑤ (データフレーム 列の追加)

データフレーム 列の追加

データフレームに 列を追加 する場合は、次のように指定します。

 データフレーム[‘列名’] = [データ, データ, ・・・]

辞書型データに 新しいキーと値 を設定するときと同じような感じになります。

以下のサンプルでは、‘D’ という列とデータを追加しています。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
import pandas as pd
df = pd.DataFrame(
{'A': [10, 20, 30, 40, 50], # 列Aとその値
'B': [0.8, 1.6, 2.4, 4.3, 7.6], # 列Bとその値
'C': [-1, -2.6, -3.5, -4.3, -5.1] }, # 列Cとその値
index = ['r1', 'r2', 'r3', 'r4', 'r5'] # 行名を設定
)

df['D'] = [1, 2, 3, 4, 5]

df

[実行結果]

データフレームに 列とデータを追加 することができました。

Pandas④ (データフレーム 行の追加)

データフレーム 行の追加

データフレームに行を追加する場合、追加する行をデータフレームとして作成し、append メソッドで追加しまします。

追加するデータフレームは列名を同じにしておく必要があります。

列名が異なると新規の列として追加されるので注意が必要です。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd
df1 = pd.DataFrame(
{'A': [10, 20, 30, 40, 50], # 列Aとその値
'B': [0.8, 1.6, 2.4, 4.3, 7.6], # 列Bとその値
'C': [-1, -2.6, -3.5, -4.3, -5.1] }, # 列Cとその値
)
df2 = pd.DataFrame(
{'A': [60, 70, 80, 90, 100], # 列Aとその値
'B': [10.2, 11.6, 12.4, 14.3, 17.6], # 列Bとその値
'C': [-6, -12.6, -13.5, -14.3, -15.1] }, # 列Cとその値
)
df1.append(df2) # df1にdf2を追加

[実行結果]

新規の行が追加されましたが、追加した行のインデックスが 0 から開始されています。

元の行のインデックスに続くようにするためには、appendメソッドの引数に ignore_index=True を指定する必要があります。

[Google Colaboratory]

1
df1.append(df2, ignore_index=True)  # 行インデックスを連続させる

[実行結果]

追加された行のインデックスが、元のデータから連続になっていることを確認できます。

indexオプションで行名を設定している場合は、追加する行データにも行名を付けてから追加します。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd
df1 = pd.DataFrame(
{'A': [10, 20, 30, 40, 50], # 列Aとその値
'B': [0.8, 1.6, 2.4, 4.3, 7.6], # 列Bとその値
'C': [-1, -2.6, -3.5, -4.3, -5.1] }, # 列Cとその値
index = ['r1', 'r2', 'r3', 'r4', 'r5'] # 行名を設定
)
df2 = pd.DataFrame(
{'A': [60, 70, 80, 90, 100], # 列Aとその値
'B': [10.2, 11.6, 12.4, 14.3, 17.6], # 列Bとその値
'C': [-6, -12.6, -13.5, -14.3, -15.1] }, # 列Cとその値
index = ['r6', 'r7', 'r8', 'r9', 'r10'] # 行名を設定
)
df1.append(df2) # df1にdf2を追加する

[実行結果]

設定した行名にて、行が追加されていることを確認できます。

Pandas③ (データフレーム 行の取得)

データフレーム 行の取得

データフレーム から特定の行を取得するためには

データフレーム [ 開始行インデックス : 終了行の1つあとのインデックス ]

のように、開始位置終了位置を示すインデックスを指定します。

インデックスは 0 からカウントされます。

注意する点としては、終了位置を示すインデックスで、指定したインデックスよりも1つ手前までが抽出されます。

まずは、2行目から4行目までを抽出してみます。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
import pandas as pd
df = pd.DataFrame(
{'A': [10, 20, 30, 40, 50], # 列Aとその値
'B': [0.8, 1.6, 2.4, 4.3, 7.6], # 列Bとその値
'C': [-1, -2.6, -3.5, -4.3, -5.1] }, # 列Cとその値
index = ['row1', 'row2', 'row3', 'row4', 'row5'] # 行名を設定
)

df[1 : 4] # 2行目から4行目までを抽出

[実行結果]

次に、先頭の行から2行目までを抽出します。

[Google Colaboratory]

1
df[: 2]               # 先頭の行から2行目までを抽出

[実行結果]

また、行名 を指定して行を抽出することもできます。

[Google Colaboratory]

1
2
# 行名で抽出する
df['row1' : 'row3'] # row1からrow3までを抽出

[実行結果]

Pandas② (データフレーム 列の取得)

データフレーム 列の取得

データフレーム の列を取得する場合は、データフレーム[‘列名’] と指定します。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
import pandas as pd
df = pd.DataFrame(
{'A': [10, 20, 30, 40, 50], # 列Aとその値
'B': [0.8, 1.6, 2.4, 4.3, 7.6], # 列Bとその値
'C': [-1, -2.6, -3.5, -4.3, -5.1] }, # 列Cとその値
index = ['row1', 'row2', 'row3', 'row4', 'row5'] # 行名を設定
)

df['A'] # 列Aを取得

[実行結果]

複数の列 を取得する場合は、データフレーム[ ‘列名’, ‘列名’, ・・・・] というようにブラケットの中身を列名のリストで指定します。

[Google Colaboratory]

1
df[['A', 'C']]          # A列、C列を取得

[実行結果]

指定した 列データ を取得することができました。

Pandas① (データフレーム)

Pandas

Pandas は、NumPy を拡張してさらに直感的な操作でデータを扱えるようにしたライブラリです。

データフレーム

Pandas には表形式でデータを管理できる データフレーム の機能が備わっています。

データフレーム は行列と同じように縦・横にデータが並ぶ構造をしていますが、数値だけではなく文字列などの任意のデータが扱えます。

また、行列のように 数値の並び を表すのではなく、行と列で構成されたデータ構造を表します。

データフレーム作成

データフレームは、DataFrameメソッド で作成します。

列データを辞書で設定し、複数の列で構成されるデータフレームを作成します。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
# 3列×5行のデータフレームを作成する

import pandas as pd
df = pd.DataFrame(
{'A': [10, 20, 30, 40, 50], # 列Aとその値
'B': [0.8, 1.6, 2.4, 4.3, 7.6], # 列Bとその値
'C': [-1, -2.6, -3.5, -4.3, -5.1] }, # 列Cとその値
index = ['row1', 'row2', 'row3', 'row4', 'row5'] # 行名を設定
)

df

データフレーム のデータは、Pythonの 辞書 を使って設定します。

辞書データはそのまま各列のデータになります。

[実行結果]

データフレーム を、Google Colaboratory で表示すると自動的に表形式で表示されます。

NumPy⑳ (逆行列)

逆行列

逆行列 とは、ある正方行列 A、X の積が単位行列となるときの 正方行列 X のことです

単位行列 とは、行列の対角の要素が全て1、それ以外の成分が0 の行列です)

NumPytransposeメソッド を使うと、逆行列 を求めることができます。

[Google Colaboratory]

1
2
3
4
5
6
import numpy as np
a = np.array([[1, 2], # 2×2の行列を作成
[3, 4]]
)
inv = np.linalg.inv(a) # 逆行列を求める
print(inv)

[実行結果]

逆行列 を求めることができました。

元の行列と 逆行列 を掛け合わせると、単位行列 となることを確認します。

1
np.dot(a, inv)

[実行結果]

誤差はあるようですが、ほぼ 単位行列 となっていることが確認できました。

NumPy⑲ (転置行列)

転置行列

行列の行と列を入れ替えたものを 転置行列 と言います。

NumPytransposeメソッド を使うと、転置行列 を求めることができます。

[Google Colaboratory]

1
2
3
4
5
6
import numpy as np
a = np.array([[1, 2, 3], # 2×3の行列を作成
[4, 5, 6]]
)

np.transpose(a) # 転置行列を求める

[実行結果]

転置行列 を求めることができました。

NumPy⑱ (行列同士の積)

行列同士の積

NumPydotメソッド を使うと、行列同士の積を算出することができます。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
import numpy as np
a = np.array([[1, 2], # 2×2の行列を作成
[3, 4]]
)
b = np.array([[5, 6], # 2×2の行列を作成
[7, 8]]
)

np.dot(a, b) # 行列の積を求める

行列同士の積では、左側の行列は行に分け、右側の行列は列に分けて、行と列を組み合わせて掛け算します。

[実行結果]

行列同士の積を算出することができました。