0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Python】Pandasのデータフレームをクエリする方法

Posted at

はじめに

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
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?