『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

pandas.DataFrame

≪【前の記事】Seriesオブジェクト

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オブジェクトから 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

DataFrameとユニバーサル関数

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の算術メソッド

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()

コメント

  1. HNaito より:

    下記は誤植と思われますので、ご確認ください。
    DATAFRAME_01 In[1] プログラムの上の文で、
    行方向 (axis=0) と列方向 (axis=1) → 列方向 (axis=0) と行方向 (axis=1)

  2. あとりえこばと より:

    【ChatGPT解説】pandasのデータフレームはテーブル形式データを表現します

    生徒: 先生、pandasのDataFrameについて教えてください。DataFrameって何ですか?

    先生: もちろんです。DataFrameは、pandasの最も重要なデータ構造の一つです。DataFrameは、2次元のテーブル形式のデータを表現するために使用されます。

    生徒: テーブル形式のデータを表現するんですね。それはどういうことですか?

    先生: DataFrameは、行と列からなる表の形式でデータを格納します。各列は異なるデータ型を持つことができます。例えば、名前、年齢、性別という列からなるデータをDataFrameで表現することができます。

    生徒: なるほど、それでDataFrameを使って具体的に何ができるんですか?

    先生: DataFrameを使うと、データの操作や分析が容易になります。DataFrameにはさまざまな操作が可能です。例えば、データの選択やフィルタリング、グループ化、結合、集計などが簡単に行えます。

    生徒: すごいですね!でも、DataFrameってどうやって作成するんですか?

    先生: DataFrameを作成する方法はいくつかあります。一般的な方法は、リストや配列、辞書などのデータ構造を使ってDataFrameを作成することです。また、外部のデータソースからデータを読み込むこともできます。例えば、CSVファイルやデータベースからデータを読み込んでDataFrameを作成することもできます。

    生徒: なるほど、データソースから読み込んだり、既存のデータ構造を使ってDataFrameを作成するんですね。

    先生: 正解です。DataFrameを作成した後は、行や列の選択、データのフィルタリング、新しい列の追加、結合操作などを行うことができます。また、pandasにはデータの集計や統計処理、可視化などの機能も備わっています。

    生徒: なるほど、DataFrameはデータの操作や分析に便利なんですね。分かりました、ありがとうございます!

    先生: どういたしまして。DataFrameはpandasの中でも重要な要素なので、しっかりと理解して活用してくださいね。