はじめに
DBを使わずにPandasのデータフレームをテーブルのように扱っているなど、大きなデータフレームから特定の値を抽出するクエリをする場合の方法をまとめました。
最初はデータフレームの基本的な説明をし、後半にクエリの方法を説明します。
データフレームについて
Pandasのデータフレーム(DataFrame)はこのようなコードです
import pandas as pd
# DataFrameの作成
data = {'名前': ['田中', '佐藤', '鈴木'],
'年齢': [25, 30, 35],
'職業': ['エンジニア', 'デザイナー', 'マネージャー']}
df = pd.DataFrame(data)
# 名前 年齢 職業
# 0 田中 25 エンジニア
# 1 佐藤 30 デザイナー
# 2 鈴木 35 マネージャー
続いてデータフレームを操作する方法です。
列の指定
SQLのselect '年齢" from...のように対象の項目を設定します。
- 1つの列を取得
age = df['年齢']
# 0 25
# 1 30
# 2 35
- 複数列を取得
data = df[['名前', '職業']]
# 名前 職業
# 0 田中 エンジニア
# 1 佐藤 デザイナー
# 2 鈴木 マネージャー
集計
SQLのgroup byのように対象の項目で集計します
# 職業毎に平均年齢を集計
avg_age = df.groupby('職業')['年齢'].mean()
# 職業
# エンジニア 25.0
# デザイナー 30.0
mean()で平均値を取得しています。他には
- min() :最小値
- max() :最大値
- sum() :合計
Pandasのデータフレームの基本をご紹介したので
続いてクエリの方法をご紹介します。
クエリする方法
# 年齢が30歳以上の行を取得
result = df.query("年齢 > 30")
# 名前 年齢 職業
# 2 鈴木 35 マネージャー
ここからはデータ量を増やして複雑なクエリを実行してみます。
import pandas as pd
# DataFrameの作成
data = {'名前': ['田中', '佐藤', '鈴木', '山本', '高橋'],
'年齢': [25, 30, 35, 40, 45],
'職業': ['エンジニア', 'デザイナー', 'マネージャー', 'エンジニア', 'デザイナー'],
'給与': [500, 600, 700, 800, 900]}
df = pd.DataFrame(data)
andを使用
年齢が30以上で、かつ給与が700以上の行を取得します
result = df.query("年齢 >= 30 and 給与 >= 700")
# 名前 年齢 職業 給与
# 2 鈴木 35 マネージャー 700
# 3 山本 40 エンジニア 800
# 4 高橋 45 デザイナー 900
orを使用
年齢が30以下、または職業がエンジニアの行を取得します
result = df.query("年齢 <= 30 or 職業 == 'エンジニア'")
# 名前 年齢 職業 給与
# 0 田中 25 エンジニア 500
# 1 佐藤 30 デザイナー 600
# 3 山本 40 エンジニア 800
isinを使用
職業がエンジニアまたはデザイナーの行を取得します
result = df[df['職業'].isin(['エンジニア', 'デザイナー'])]
# 名前 年齢 職業 給与
# 0 田中 25 エンジニア 500
# 1 佐藤 30 デザイナー 600
# 3 山本 40 エンジニア 800
# 4 高橋 45 デザイナー 900
クエリ条件で絞り込み集計する
年齢が30以上の人で、職業毎の平均給与を計算します
result = df[df['年齢'] >= 30].groupby('職業')['給与'].mean()
# 職業
# エンジニア 800.0
# デザイナー 750.0
# マネージャー 700.0
2つのデータフレームを結合してクエリする
データ分析する時にデータフレーム同士を結合して集計することがあります。
ここでは2つのデータフレームを内部結合してクエリを実行してみます。
2つのデータフレームを作成します
import pandas as pd
# DataFrame1の作成
data1 = {'ID': [1, 2, 3, 4],
'名前': ['田中', '佐藤', '鈴木', '山本'],
'年齢': [25, 30, 35, 40]}
df1 = pd.DataFrame(data1)
# DataFrame2の作成
data2 = {'ID': [3, 4, 5, 6],
'職業': ['マネージャー', 'エンジニア', 'デザイナー', '営業'],
'給与': [700, 800, 600, 550]}
df2 = pd.DataFrame(data2)
2つのデータフレームを結合します
merged_df = pd.merge(df1, df2, on='ID', how='inner')
# ID 名前 年齢 職業 給与
# 0 3 鈴木 35 マネージャー 700
# 1 4 山本 40 エンジニア 800
IDの値を元に内部結合しました
結合したデータフレームに対してクエリします
result = merged_df.query("年齢 >= 40 and 給与 >= 700")
# ID 名前 年齢 職業 給与
# 1 4 山本 40 エンジニア 800