Pandasは、Pythonでデータ分析を行う際に広く使用されるオープンソースのライブラリです。
データサイエンスや機械学習の分野で必須のツールとされ、主にデータの前処理や探索的データ分析(EDA)に利用されます。
Pandasは、データの読み込み、加工、分析を簡単に、効率的に行うための豊富な機能を提供します。
今回は、Pandasの強力な機能の一つであるquery関数に焦点を当て、DataFrame内のデータを選択またはフィルタリングする方法を紹介します。
query関数を使うことで、データフレームから条件に一致するデータを簡潔に、直感的に抽出することが可能になります。
Contents
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関数の概要
Pandasのquery関数は、DataFrame内で条件に基づくデータの選択を行うための強力なツールです。
この関数を使用することで、データフレームの列に対する比較演算子を含む条件式を文字列として渡し、その条件に一致する行のみを抽出できます。
query関数の基本的な文法は以下の通りです。
df.query('条件式')
Queryを使うメリット
query関数を使用する主なメリットは、コードの可読性と記述の簡潔さです。
特に、複数の条件を組み合わせる場合や、変数名が長くて複雑なデータフレームを扱う際に、その威力を発揮します。
また、内部的に最適化されているため、大規模なデータセットに対しても高速に動作することがあります。
Query関数を使ったデータの選択
条件に基づくデータの選択方法
Pandasのquery関数を使うと、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
まとめ
今回は、Pandasのquery関数を用いてDataFrameのデータを選択し、フィルタリングする方法について紹介しました。
query関数の基本から応用までを探り、その使い方とメリット、実業務での具体的な活用例を通じて、データ分析作業の効率化とコードの可読性向上のポイントを解説しました。
この地味で便利なquery関数の活用スキルを身に着け、より洗練されたデータ操作を行う一助となることを願っています。

