pandas.DataFrame

pandas.DataFrame

DataFrameの構造と作成方法

 pandas.DataFrame は NumPy の二次元配列に列方向 (axis=0) と行方向 (axis=1) のラベルを割り当てたオブジェクトです。
 
 pandas.DataFrame() に二次元配列を渡すと、行と列に 0 から始まる整数が自動的に割り振られた DataFrame(データフレーム)が生成されます。

# PANDAS_DATAFRAME_01

# In[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

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

# In[2]

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

 一方、DataFrame 列に割り当てられた(一番上に並んでいる)数字は列ラベル (column labels) とよばれ、columns属性で参照できます。

# In[3]

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

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

# In[4]

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

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

# In[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 に列ラベルを指定すると対応する列が返ります。
 戻り値にはラベル名とデータ型も含まれます。

# In[6]

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

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

# In[7]

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

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

# PANDAS_DATAFRAME_02

# In[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つの表が連結されます。

# In[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

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

# PANDAS_DATAFRAME_03

# In[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() に渡して各要素の正弦値を計算してみます。

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

# PANDAS_DATAFRAME_04

# In[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 を生成します。

# In[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 を加えてみます。

# In[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のデータ操作と整列

# In[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()