[pandas] DataFrameオブジェクト

[pandas] DataFrameオブジェクト

DataFrame

 pandas の DataFrameオブジェクト は NumPy の二次元配列に行方向 (axis=0) と列方向 (axis=1) のラベルを割り当てます。

配列からDataFrameを生成する

 pandas.DataFrame() に二次元配列を渡すと、行と列に 0 から始まる整数が自動的に割り振られます。

# リストPD06-1

import numpy as np
import pandas as pd

# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]
x = np.arange(1, 13).reshape(3, 4)

# DataFrameオブジェクトを生成
data = pd.DataFrame(x)

print(data)
   0   1   2   3
0  1   2   3   4
1  5   6   7   8
2  9  10  11  12

 行に割り当てられた数字はインデクスまたは行ラベル (row labels) とよばれ、index属性で参照できます。

# リストPD06-2

# 行ラベルを取得
print(data.index)
RangeIndex(start=0, stop=3, step=1)

 列に割り当てられた数字は列ラベル (column labels) とよばれ、columns属性で参照できます。

# リストPD06-3

# 列ラベルを取得
print(data.columns)
RangeIndex(start=0, stop=4, step=1)

 データの核となる二次元配列 (ndarray) は values属性で参照できます。

# リストPD06-4

# 二次元を取得
print(data.values)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]

 index引数と columuns引数にシーケンスや配列を渡せば、行ラベルと列ラベルを設定できます。

# リストPD06-5

# 列ラベル
clm = ["a", "b", "c", "d"]

# 行ラベル
idx = ["Ⅰ", "Ⅱ", "Ⅲ"]

# DataFrameオブジェクトを生成
data = pd.DataFrame(x, index = idx, columns = clm)

print(data)
   a   b   c   d
Ⅰ  1   2   3   4
Ⅱ  5   6   7   8
Ⅲ  9  10  11  12

 DataFrame に列ラベルを指定すると対応する列が返ります。
 戻り値にはラベル名とデータ型も含まれます。

# リストPD06-6

# b列を参照
print(data["b"])
Ⅰ     2
Ⅱ     6
Ⅲ    10
Name: b, dtype: int32

 列データは DataFrame の属性として保存されているので、次のようなアクセスもできます。

# リストPD06-7

# b列を参照
print(data.b)
Ⅰ     2
Ⅱ     6
Ⅲ    10
Name: b, dtype: int32

SeriesからDataFrameを生成する

 Seriesオブジェクトから DataFrameオブジェクトを生成することもできます。
 例として、惑星名によってラベリングされた、質量と赤道半径のデータを格納した Seriesオブジェクトを生成してみます。

# リストPD07-1

import numpy as np
import pandas as pd

# 惑星名のリスト
planet_list = ["水星", "金星", "地球", "火星"]

# 惑星の質量(地球=1)
mass_list = [0.05527, 0.8150, 1, 0.1074]

# 惑星の赤道半径(km)
radius_list = [2440, 5988, 6378, 3397]

# 惑星名と質量のSeriesオブジェクト
mass_series = pd.Series(mass_list, index = planet_list)

# 惑星名と半径のSeriesオブジェクト
radius_series = pd.Series(radius_list, index = planet_list)

print(mass_series, "\n")
print(radius_series)
水星    0.05527
金星    0.81500
地球    1.00000
火星    0.10740
dtype: float64 

水星    2440
金星    5988
地球    6378
火星    3397
dtype: int64

 Python のディクショナリを使って、mass_series に質量、mass_radius に半径というラベルを設定し、これを pandas.DataFrame() に渡すと2つの表が連結されます。

# リストPD07-2

# 辞書で見出しを設定
columns = {"質量[地球=1]" : mass_series,
           "半径[km]" : radius_series}

# DataFrameオブジェクトを生成
planet_data = pd.DataFrame(columns)

print(planet_data)
    質量[地球=1]  半径[km]
水星   0.05527    2440
金星   0.81500    5988
地球   1.00000    6378
火星   0.10740    3397

DataFrameとufunc

 NumPy のユニバーサル関数 (ufunc) に DataFrame を渡すと、values属性 (二次元配列) に関数が適用されて値が変更されますが、行ラベルと列ラベルは保存されます。具体例で確認してみましょう。次のような 3×4 サイズの配列を組み込んだ DataFrame を生成します。

# リストPD08-1

import numpy as np
import pandas as pd

# 2次元配列を生成
arr = np.arange(1, 13).reshape(3, 4)

# DataFrameオブジェクトを生成
x = pd.DataFrame(arr, columns = ["A", "B", "C", "D"])

print(x)
   A   B   C   D
0  1   2   3   4
1  5   6   7   8
2  9  10  11  12

 x を numpy.sin() に渡して各要素の正弦値を計算してみます。

# リストPD08-2

# すべての要素の正弦値を計算する
y = np.sin(x)

print(y)
          A         B         C         D
0  0.841471  0.909297  0.141120 -0.756802
1 -0.958924 -0.279415  0.656987  0.989358
2  0.412118 -0.544021 -0.999990 -0.536573

DataFrameのデータ操作

 DataFrame同士で演算を行なうと行ラベルと列ラベルの両方が自動ソートされます。簡単な例を見てみましょう。まず最初に 2×2サイズの配列を組み込んだ DataFrame を生成します。

# リストPD09-1

import numpy as np
import pandas as pd

# 2×2の配列を作成
arr_1 = np.array([[1, 2],
                  [3, 4]])

# DataFrameを作成
x = pd.DataFrame(arr_1, columns=list("AB"))

print(x)
   A  B
0  1  2
1  3  4

 次に 3×3サイズの配列を組み込んだ DataFrame を生成します。

# リストPD09-2

# 3×3の配列を作成
arr_2 = np.array([[10, 20, 30],
                  [40, 50, 60],
                  [70, 80, 90]])

# DataFrameを作成
y = pd.DataFrame(arr_2, columns=list("CBA"))

print(y)
    C   B   A
0  10  20  30
1  40  50  60
2  70  80  90

 x に y を加えてみます。

# リストPD09-3

# xにyを加える
print(x + y)
      A     B   C
0  31.0  22.0 NaN
1  63.0  54.0 NaN
2   NaN   NaN NaN

 x には 行ラベル 2 と列ラベル C が存在しないので、2 行と C 列には NaN (非数) が埋め込まれています。該当するラベルが存在しない箇所に数値を割り当てて演算を実行したいときには、算術メソッドの fill_value を指定します。たとえば fill_value に 0 を渡すと下図のような演算が実行されます。

 [python - pandas] DataFrameのデータ操作と整列

# リストPD09-4

# 仮想的なラベルを設定してxとyを加える
z = x.add(y, fill_value=0)

print(z)
      A     B     C
0  31.0  22.0  10.0
1  63.0  54.0  40.0
2  90.0  80.0  70.0

 DataFrame は以下のような算術メソッドを備えています。

演算の種類 算術メソッド
加算 add()
減算 sub()
乗算 mul()
除算 div()
切り捨て除算 floordiv()
剰余 mod()
べき乗 pow()