【Python】Pandas DataFrameの作成方法(リスト・辞書)と型変換(astype)

Pandasにおける DataFrame(データフレーム)は、Excelのスプレッドシートのような行と列を持つ2次元のデータ構造です。データ分析の現場では、CSVやデータベースから読み込むだけでなく、Pythonのリストや辞書から動的にDataFrameを生成するケースも多々あります。

本記事では、リストおよび辞書(ディクショナリ)からDataFrameを作成する基本的な手順と、作成したデータの型(dtype)を astype メソッドで変換する方法について解説します。

目次

リストと辞書からのDataFrame生成

DataFrameを作成する最も一般的な方法は、pd.DataFrame コンストラクタを使用することです。データの渡し方によって、大きく分けて2つのパターンがあります。

  1. 2次元リストから: 行単位でデータを定義する方法。
  2. 辞書から: 列単位(カラムごと)でデータを定義する方法。

以下に、店舗ごとの売上データを例とした実装コードを示します。

import pandas as pd
import numpy as np

def create_and_convert_dataframe():
    """
    リストおよび辞書からのDataFrame生成と、
    astypeを用いたデータ型変換を実演する関数
    """

    print("=== 1. リスト(2次元配列)から生成 ===")
    # 行単位のデータ: [店舗ID, 店舗名, 売上数量]
    sales_data_list = [
        [101, "Tokyo_Main", 150],
        [102, "Osaka_Branch", 80],
        [103, "Nagoya_Shop", 120]
    ]
    
    # columns引数で列名を定義
    # index引数で行ラベルを定義(省略時は0からの連番)
    df_from_list = pd.DataFrame(
        sales_data_list,
        columns=["Store_ID", "Store_Name", "Quantity"],
        index=["row_1", "row_2", "row_3"]
    )
    
    print("--- リストから作成したDataFrame ---")
    print(df_from_list)
    print("\n")


    print("=== 2. 辞書(Key=列名)から生成 ===")
    # 列単位のデータ: {"列名": [データリスト]}
    sales_data_dict = {
        "Store_ID": [101, 102, 103],
        "Store_Name": ["Tokyo_Main", "Osaka_Branch", "Nagoya_Shop"],
        "Quantity": [150, 80, 120]
    }
    
    # 辞書のキーが自動的に列名になります
    df_from_dict = pd.DataFrame(
        sales_data_dict,
        index=["row_1", "row_2", "row_3"]
    )
    
    print("--- 辞書から作成したDataFrame ---")
    print(df_from_dict)
    print("\n")


    print("=== 3. データ型の確認と変換 (astype) ===")
    # 現在のデータ型を確認
    print("--- 変換前のdtypes ---")
    print(df_from_dict.dtypes)
    
    # 型変換の実行
    # Store_ID: 整数(int) -> 浮動小数点数(float)
    # Store_Name: オブジェクト(object) -> Pandas専用文字列型(string)
    df_converted = df_from_dict.astype({
        "Store_ID": np.float64,
        "Store_Name": pd.StringDtype()
    })
    
    print("\n--- 変換後のdtypes ---")
    print(df_converted.dtypes)
    
    print("\n--- 変換後のDataFrame表示 ---")
    print(df_converted)

if __name__ == "__main__":
    create_and_convert_dataframe()

実行結果

=== 1. リスト(2次元配列)から生成 ===
--- リストから作成したDataFrame ---
       Store_ID    Store_Name  Quantity
row_1       101    Tokyo_Main       150
row_2       102  Osaka_Branch        80
row_3       103   Nagoya_Shop       120


=== 2. 辞書(Key=列名)から生成 ===
--- 辞書から作成したDataFrame ---
       Store_ID    Store_Name  Quantity
row_1       101    Tokyo_Main       150
row_2       102  Osaka_Branch        80
row_3       103   Nagoya_Shop       120


=== 3. データ型の確認と変換 (astype) ===
--- 変換前のdtypes ---
Store_ID       int64
Store_Name    object
Quantity       int64
dtype: object

--- 変換後のdtypes ---
Store_ID      float64
Store_Name     string
Quantity        int64
dtype: object

--- 変換後のDataFrame表示 ---
       Store_ID    Store_Name  Quantity
row_1     101.0    Tokyo_Main       150
row_2     102.0  Osaka_Branch        80
row_3     103.0   Nagoya_Shop       120

コードのポイント解説

リストと辞書の使い分け

  • リストから: 行ごとにデータがまとまっている場合(例:CSVファイルの行ごとの読み込み処理など)に適しています。列名は別途 columns 引数で指定する必要があります。
  • 辞書から: 列ごとにデータがまとまっている場合(例:JSONデータの処理など)に適しています。辞書のキーがそのまま列名になるため、可読性が高くなります。

データ型の制御(astype)

Pandasでは通常、文字列データは object 型として扱われますが、Pandas 1.0以降ではより厳密な文字列操作が可能な StringDtype(表示は string)が導入されています。

  • np.float64: 数値計算ライブラリNumPyの型を指定して、整数を小数として扱いたい場合などに使用します。
  • pd.StringDtype(): Pandas専用の文字列型。従来の object 型よりもテキストデータの扱いに特化しています。

astype メソッドに辞書を渡すことで、列ごとに異なる型へ一括変換することが可能です。これにより、メモリ使用量の最適化や、後続の分析処理でのエラー防止が期待できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次