Pandas DataFrame の生成とデータ操作の実践ガイド

DataFrame の構築方法

Pandas における DataFrame は、データ分析の基盤となる構造です。ここでは、様々なソースから DataFrame を生成する手法について解説します。

配列および辞書からの生成

NumPy の配列や Python の辞書を用いて、直接 DataFrame をインスタンス化できます。

二维配列による生成

import numpy as np
import pandas as pd

# 50 から 100 の範囲で乱数を生成
grade_data = np.random.randint(50, 101, (4, 3))
subject_list = ['国語', '算数', '理科']
student_id = [2001, 2002, 2003, 2004]

# DataFrame の作成
score_table = pd.DataFrame(data=grade_data, columns=subject_list, index=student_id)
print(score_table)

実行結果は以下のようになります。

      国語  算数  理科
2001  55  82  76
2002  68  59  91
2003  85  77  88
2004  92  64  53

辞書による生成

キーを列名、値をリストとして渡すことも可能です。

score_dict = {
    '国語': [70, 85, 60, 90],
    '算数': [88, 72, 95, 65],
    '理科': [76, 81, 89, 70],
}
student_id = [2001, 2002, 2003, 2004]
score_table_dict = pd.DataFrame(data=score_dict, index=student_id)
print(score_table_dict)

外部ファイルからの読み込み

実務では CSV や Excel ファイルからデータを読み込むケースがほとんどです。

CSV ファイルの読み込み

read_csv 関数を使用します。主要なパラメータには以下があります。

  • sep:区切り文字(デフォルトはカンマ)。
  • header:ヘッダー行の位置。
  • index_col:インデックスとして使用する列。
  • usecols:読み込む列の指定。
  • na_values:欠損値として扱う文字列。
csv_data = pd.read_csv('sales_record.csv', index_col='transaction_id')
print(csv_data)

Excel ファイルの読み込み

read_excel 関数は CSV と類似していますが、sheet_name でシートを指定できます。また、skiprows に関数を渡すことで、特定の行をスキップする処理も可能です。

excel_data = pd.read_excel(
    io='pharmacy_sales.xlsx',
    usecols=['date', 'card_id', 'item', 'qty', 'amount'],
    skiprows=lambda x: x > 0 and x % 3 == 0  # 3 行ごとにスキップ
)
print(excel_data)

データベースからの読み込み

SQL クエリを実行して DataFrame を生成するには read_sql を使用します。データベース接続には pymysql などのライブラリを用います。

注意:接続情報は環境変数で管理するなど、セキュリティに配慮してください。

import pymysql

# 接続情報の設定(実際は環境変数から取得することを推奨)
connection = pymysql.connect(
    host='localhost',
    port=3306,
    user='db_user',
    password='secure_password',
    database='company_db',
    charset='utf8mb4'
)

# SQL クエリの実行
sql_data = pd.read_sql('SELECT * FROM employees', connection, index_col='emp_id')
print(sql_data)

基本属性とメソッド

DataFrame の構造を把握するための属性とメソッドを紹介します。ここでは、従業員情報と部署情報の DataFrame を用意します。

departments = pd.read_sql('SELECT * FROM dept', connection, index_col='dept_id')
employees = pd.read_sql('SELECT * FROM emp', connection, index_col='emp_id')

主要な属性は以下の通りです。

属性名 説明
columns 列のインデックス
dtypes 各列のデータ型
shape 行数と列数
values NumPy 配列としてのデータ

データの内容を確認するには info()head() が便利です。

employees.info()
employees.head(3)

データの取得と操作

インデックスとスライス

特定の列を取得するには、属性アクセスまたは辞書形式のアクセスを使用します。

employees.name
# または
employees['name']

これらは Series オブジェクトを返します。行を取得するには loc(ラベル)または iloc(整数位置)を使用します。

# ラベルで行を取得
employees.loc[1001]
# 位置で行を取得
employees.iloc[0]

複数の行や列を取得すると、結果は DataFrame になります。

employees[['name', 'position']]
employees.loc[[1001, 1005, 1010]]

特定のセル値へのアクセスおよび更新は、loc を同時に指定するのが推奨されます。

# 値の取得
employees.loc[1001, 'position']
# 値の更新
employees.loc[1001, 'position'] = 'Senior Engineer'

データのフィルタリング

条件に基づいて行を絞り込むには、布尔インデックスを使用します。

# 給与が 5000 以上の従業員
high_salary_emp = employees[employees.salary > 5000]

複数の条件を組み合わせることも可能です。

# 給与が 5000 以上かつ部署 ID が 20
filtered = employees[(employees.salary > 5000) & (employees.dept_id == 20)]

また、query メソッドを使うと、文字列で条件を記述でき、可読性が向上します。

filtered = employees.query('salary > 5000 and dept_id == 20')

データの重塑と結合

複数の DataFrame を統合するには、concatmerge を使用します。

縦方向の結合(concat)

構造が同じ複数の DataFrame を縦に積み重ねます。

all_employees = pd.concat([employees, additional_employees])

インデックスが重複する場合は、必要に応じて reset_index で再設定します。

all_employees.reset_index(inplace=True)

テーブルの結合(merge)

異なる DataFrame をキーに基づいて結合します。これは SQL の JOIN 操作に相当します。

merged_data = pd.merge(departments, all_employees, how='inner', on='dept_id')

how パラメータには leftrightinnerouter が指定可能です。結合キーの列名が異なる場合は、left_onright_on を使用してそれぞれ指定します。

# 左外部結合の例
merged_left = pd.merge(departments, all_employees, how='left', on='dept_id')

左表に存在し右表に一致するデータがない行については、欠損値(NaN)が埋められます。

タグ: Pandas Python DataFrame data-analysis sql-integration

8月4日 14:53 投稿