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 を統合するには、concat と merge を使用します。
縦方向の結合(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 パラメータには left、right、inner、outer が指定可能です。結合キーの列名が異なる場合は、left_on と right_on を使用してそれぞれ指定します。
# 左外部結合の例
merged_left = pd.merge(departments, all_employees, how='left', on='dept_id')
左表に存在し右表に一致するデータがない行については、欠損値(NaN)が埋められます。