Pandasにおける DataFrame(データフレーム)は、Excelのスプレッドシートのような行と列を持つ2次元のデータ構造です。データ分析の現場では、CSVやデータベースから読み込むだけでなく、Pythonのリストや辞書から動的にDataFrameを生成するケースも多々あります。
本記事では、リストおよび辞書(ディクショナリ)からDataFrameを作成する基本的な手順と、作成したデータの型(dtype)を astype メソッドで変換する方法について解説します。
目次
リストと辞書からのDataFrame生成
DataFrameを作成する最も一般的な方法は、pd.DataFrame コンストラクタを使用することです。データの渡し方によって、大きく分けて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 メソッドに辞書を渡すことで、列ごとに異なる型へ一括変換することが可能です。これにより、メモリ使用量の最適化や、後続の分析処理でのエラー防止が期待できます。
