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
関数の活用スキルを身に着け、より洗練されたデータ操作を行う一助となることを願っています。