Pandas Queryを使ったDataFrameのデータ選択とフィルタリング

Pandas Queryを使ったDataFrameのデータ選択とフィルタリング

Pandasは、Pythonでデータ分析を行う際に広く使用されるオープンソースのライブラリです。

データサイエンスや機械学習の分野で必須のツールとされ、主にデータの前処理や探索的データ分析(EDA)に利用されます。

Pandasは、データの読み込み、加工、分析を簡単に、効率的に行うための豊富な機能を提供します。

今回は、Pandasの強力な機能の一つであるquery関数に焦点を当て、DataFrame内のデータを選択またはフィルタリングする方法を紹介します。

query関数を使うことで、データフレームから条件に一致するデータを簡潔に、直感的に抽出することが可能になります。

Pandas DataFrameの基本

 DataFrameの作成方法

Pandasの中心的なデータ構造はDataFrameです。

DataFrameは、表形式のデータを扱うための2次元ラベル付きデータ構造で、異なる型の列を持つことができます。

以下に、Pandas DataFrameを作成する基本的な方法を示します。

import pandas as pd

# データを作成(辞書形式)
data = {
    'Name': ['Taro', 'Jiro', 'Saburo'],
    'Age': [25, 22, 18],
    'City': ['Tokyo', 'Osaka', 'Nagoya']
}

# DataFrameを作成
df = pd.DataFrame(data)

print(df)

 

以下、実行結果です。

     Name  Age    City
0    Taro   25   Tokyo
1    Jiro   22   Osaka
2  Saburo   18  Nagoya

 

 基本的なデータ操作(表示、基本統計量の計算など)

DataFrameを作成した後、Pandasでは様々なデータ操作が可能です。

データの表示や基本統計量の計算など、いくつかの基本的な操作を以下に示します。\nは改行です。

# 最初の5行を表示
print('最初の5行 \n',df.head())
print('\n')

# 基本統計量の表示
print('基本統計量 \n',df.describe())
print('\n')

# 特定の列を選択
print('特定の列 \n',df['Name'])
print('\n')

# 行を条件でフィルタリング
print('行を条件でフィルタリング \n',df[df['Age'] > 20])

 

以下、実行結果です。

最初の5行 
      Name  Age    City
0    Taro   25   Tokyo
1    Jiro   22   Osaka
2  Saburo   18  Nagoya


基本統計量 
              Age
count   3.000000
mean   21.666667
std     3.511885
min    18.000000
25%    20.000000
50%    22.000000
75%    23.500000
max    25.000000


特定の列 
 0      Taro
1      Jiro
2    Saburo
Name: Name, dtype: object


行を条件でフィルタリング 
    Name  Age   City
0  Taro   25  Tokyo
1  Jiro   22  Osaka

 

Query関数の基本

 Query関数の概要

Pandasquery関数は、DataFrame内で条件に基づくデータの選択を行うための強力なツールです。

この関数を使用することで、データフレームの列に対する比較演算子を含む条件式を文字列として渡し、その条件に一致する行のみを抽出できます。

query関数の基本的な文法は以下の通りです。

df.query('条件式')

 

 Queryを使うメリット

query関数を使用する主なメリットは、コードの可読性と記述の簡潔さです。

特に、複数の条件を組み合わせる場合や、変数名が長くて複雑なデータフレームを扱う際に、その威力を発揮します。

また、内部的に最適化されているため、大規模なデータセットに対しても高速に動作することがあります。

 

Query関数を使ったデータの選択

 条件に基づくデータの選択方法

Pandasquery関数を使うと、DataFrameから条件に一致するデータを簡単に選択できます。

これは、特定の条件や複数の条件を組み合わせてデータをフィルタリングする場合に非常に便利です。

以下は、query関数を使用して条件に基づいてデータを選択する基本的な方法を示します。

# 'Age'が20より大きいすべての行を選択
selected_data = df.query('Age > 20')

print('Ageが20より大きいすべての行 \n',selected_data)
print('\n')

# 'City'が'Tokyo'である行を選択
selected_data = df.query('City == "Tokyo"')

print('CityがTokyoである行 \n',selected_data)

 

以下、実行結果です。

Ageが20より大きいすべての行 
    Name  Age   City
0  Taro   25  Tokyo
1  Jiro   22  Osaka


CityがTokyoである行 
    Name  Age   City
0  Taro   25  Tokyo

 

 複数条件の組み合わせ

query関数は、複数の条件を組み合わせてデータを選択することもできます。

論理演算子(and, or)を使用して条件を結合し、より複雑なデータの選択クエリを実行できます。

以下、コード例です。

# 'Age'が20より大きく、かつ'City'が'Tokyo'である行を選択
selected_data = df.query('Age > 20 and City == "Tokyo"')

print('Ageが20より大きく、CityがTokyoである行 \n',selected_data)
print('\n')

# 'Age'が30未満、または'City'が'Osaka'である行を選択
selected_data = df.query('Age < 30 or City == "Osaka"')

print('Ageが30未満、またはCityがOsakaである行 \n',selected_data)

 

以下、実行結果です。

Ageが20より大きく、CityがTokyoである行 
    Name  Age   City
0  Taro   25  Tokyo


Ageが30未満、またはCityがOsakaである行 
      Name  Age    City
0    Taro   25   Tokyo
1    Jiro   22   Osaka
2  Saburo   18  Nagoya

 

Query関数を使ったデータのフィルタリング

 文字列操作によるフィルタリング

query関数では、文字列操作を行うことも可能です。

これにより、特定の文字列を含む、または特定のパターンに一致するデータ行を簡単にフィルタリングできます。

以下、コード例です。

# 'City'が'Tokyo'を含む行を選択
filtered_data = df.query('City == "Tokyo"')
print('CityがTokyoを含む行 \n',filtered_data)
print('\n')

# 文字列メソッドを使用して、大文字・小文字を区別せずにフィルタリング(例: 'city'列が'tokyo'を含む行)
filtered_data = df.query('City.str.lower() == "tokyo"')
print('CityがTokyoを含む行 \n',filtered_data)

 

以下、実行結果です。

CityがTokyoを含む行 
    Name  Age   City
0  Taro   25  Tokyo


CityがTokyoを含む行 
    Name  Age   City
0  Taro   25  Tokyo

 

 数値条件を用いたフィルタリング

query関数を使って、特定の数値条件を満たすデータを選択することもできます。

範囲指定や特定の数値に一致するデータの選択など、数値に関する複雑な条件も簡単に扱うことができます。

以下、コード例です。

# 'Age'が20以上30以下の行を選択
filtered_data = df.query('20 <= Age <= 30')
print('Ageが20以上30以下の行 \n',filtered_data)
print('\n')

# 特定の値を除外してフィルタリング
filtered_data = df.query('Age != 25')
print('Ageが25以外の行 \n',filtered_data)

以下、実行結果です。

Ageが20以上30以下の行 
    Name  Age   City
0  Taro   25  Tokyo
1  Jiro   22  Osaka


Ageが25以外の行 
      Name  Age    City
1    Jiro   22   Osaka
2  Saburo   18  Nagoya

 

 日付や時刻データのフィルタリング

日付や時刻データを含む列に対してもquery関数を用いることができます。

これにより、特定の期間内に該当するデータや、特定の日付に一致するデータを選択することが可能になります。

以下、コード例です。

# 日付データのダミー列を追加(日付はサンプルで適当に付けています)
df['Date'] = pd.date_range(start='2021-01-01', periods=len(df), freq='D')

print('日付付きデータフレーム \n',df)
print('\n')

# 特定の日付より後のデータを選択
filtered_data = df.query('Date > "2021-01-02"')

print('特定の日付より後のデータ \n',filtered_data)

 

以下、実行結果です。

日付付きデータフレーム 
      Name  Age    City       Date
0    Taro   25   Tokyo 2021-01-01
1    Jiro   22   Osaka 2021-01-02
2  Saburo   18  Nagoya 2021-01-03


特定の日付より後のデータ 
      Name  Age    City       Date
2  Saburo   18  Nagoya 2021-01-03

 

実践的なQuery関数の活用例

実際のビジネスやデータ分析プロジェクトでは、query関数を利用して複雑なデータ操作や分析を行う機会が多くあります。

 

 実業務での応用例

  売上データ分析例

製品ごとの売上データが含まれるデータフレームを考えます。

query関数を使用して、特定の期間内、または特定の条件を満たす製品の売上を分析することができます。

以下、コード例です。

import pandas as pd

# 売上データのダミーデータを作成
sales_data = pd.DataFrame({
    'Product': ['Product A', 'Product B', 'Product C', 'Product D'],
    'Sales': [250, 150, 300, 200],
    'Region': ['East', 'West', 'East', 'West'],
    'Date': pd.date_range(start='2022-01-01', periods=4, freq='M')
})

# 特定のリージョンのデータを選択
east_region_sales = sales_data.query('Region == "East"')

print('Eastリージョンの売上 \n',east_region_sales)
print('\n')

# 特定の期間内の売上が200以上の製品を選択
high_sales_products = sales_data.query('Sales >= 200 and Date >= "2022-01-01"')

print('Salesが200以上の製品 \n',high_sales_products)

 

以下、実行結果です。

Eastリージョンの売上 
      Product  Sales Region       Date
0  Product A    250   East 2022-01-31
2  Product C    300   East 2022-03-31


Salesが200以上の製品 
      Product  Sales Region       Date
0  Product A    250   East 2022-01-31
2  Product C    300   East 2022-03-31
3  Product D    200   West 2022-04-30

 

 顧客フィードバックデータ分析

顧客からのフィードバックデータが含まれるデータフレームを想定します。

query関数を利用して、特定のキーワードを含むフィードバックや、評価が低いフィードバックを抽出し、製品改善のための分析を行います。

以下、コード例です。

import pandas as pd

# 顧客フィードバックのダミーデータを作成
feedback_data = pd.DataFrame({
    'CustomerID': [1, 2, 3, 4, 5],
    'Feedback': [
        "Great product, but the color fades quickly.",
        "Loved the product!",
        "The material feels cheap.",
        "Not what I expected based on the description.",
        "Excellent quality!"
    ],
    'Rating': [3, 5, 2, 2, 5]
})

# 評価が3未満のフィードバックを選択
low_rating_feedback = feedback_data.query('Rating < 3')
print('評価が3未満のフィードバック \n',low_rating_feedback)
print('\n')

# 特定のキーワードを含むフィードバックを抽出
keyword_feedback = feedback_data.query('Feedback.str.contains("cheap")')
print('特定のキーワード(cheap)を含むフィードバック \n',keyword_feedback)

 

以下、実行結果です。

評価が3未満のフィードバック 
    CustomerID                                       Feedback  Rating
2           3                      The material feels cheap.       2
3           4  Not what I expected based on the description.       2


特定のキーワード(cheap)を含むフィードバック 
    CustomerID                   Feedback  Rating
2           3  The material feels cheap.       2

 

 在庫データ分析

 

以下、コード例です。

import pandas as pd

# 在庫データのダミーデータを作成
inventory_data = pd.DataFrame({
    'ProductID': ['P001', 'P002', 'P003', 'P004'],
    'StockQuantity': [500, 150, 300, 600],
    'ForecastedDemand': [300, 150, 200, 400]
})

# 過剰在庫と判断される商品を選択(在庫数が需要予測の150%を超える場合)
excess = inventory_data.query('StockQuantity > ForecastedDemand * 1.5')

print('過剰在庫と判断される商品 \n',excess)

 

以下、実行結果です。

過剰在庫と判断される商品 
   ProductID  StockQuantity  ForecastedDemand
0      P001            500               300

 

まとめ

今回は、Pandasquery関数を用いてDataFrameのデータを選択し、フィルタリングする方法について紹介しました。

query関数の基本から応用までを探り、その使い方とメリット、実業務での具体的な活用例を通じて、データ分析作業の効率化とコードの可読性向上のポイントを解説しました。

この地味で便利なquery関数の活用スキルを身に着け、より洗練されたデータ操作を行う一助となることを願っています。