Pandas の SQL クエリ スタイルでデータのサブセットを選択するにはどうすればよいですか?

WBOY
リリース: 2023-08-31 10:13:10
転載
1149 人が閲覧しました

如何在 Pandas 的 SQL 查询样式中选择数据子集?

はじめに

この記事では、Pandas を使用して SQL スタイルのフィルタリングによるデータ分析を実行する方法を説明します。ほとんどの企業データはデータベースに保存されており、取得および操作には SQL が必要です。たとえば、Oracle、IBM、Microsoft などの企業は、独自のデータベースと独自の SQL 実装を持っています。

データは常に CSV ファイルに保存されるわけではないため、データ サイエンティストはキャリアのどこかの時点で SQL を扱う必要があります。会社のデータのほとんどは Oracle に保存されているため、私は個人的に Oracle を使用することを好みます。

シナリオ – 1 次の条件を持つすべての映画をデータセットから検索するタスクがあるとします。

  • 映画の言語は英語 (en) またはスペイン語 (es) である必要があります。
  • 映画の人気は 500 ~ 1000 の間である必要があります。
  • ムービーのステータスは公開済みである必要があります。
  • 投票数は 5000 より大きくなければなりません。上記のシナリオの場合、SQL ステートメントは次のようになります。
SELECT
FROM WHERE
title AS movie_title
,original_language AS movie_language
,popularityAS movie_popularity
,statusAS movie_status
,vote_count AS movie_vote_count movies_data
original_languageIN ('en', 'es')

AND status=('Released')
AND popularitybetween 500 AND 1000
AND vote_count > 5000;
ログイン後にコピー

ニーズを満たす SQL ステートメントを確認できたので、パンダを使用して段階的に進めてみましょう。 2つの方法を紹介します。

方法 1: ブール インデックス

1.movi​​es_data データセットを DataFrame に読み込みます。

import pandas as pd movies = pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv")
ログイン後にコピー

各条件に変数を割り当てます。

languages = [ "en" , "es" ] condition_on_languages = movies . original_language . isin ( languages )
condition_on_status = movies . status == "Released"
condition_on_popularity = movies . popularity . between ( 500 , 1000 )
condition_on_votecount = movies . vote_count > 5000
ログイン後にコピー

3. すべての条件 (ブール配列) を結合します。

final_conditions = ( condition_on_languages & condition_on_status & condition_on_popularity & condition_on_votecount )
columns = [ "title" , "original_language" , "status" , "popularity" , "vote_count" ]
# clubbing all together movies . loc [ final_conditions , columns ]
ログイン後にコピー

タイトル原語 ステータス人気度投票数##95星##788デッドプール

< p>

zh

公開

724.247784

10867

< /td>

## zh

リリース済み

514.569956

10995

方法 2:- .query() メソッド。

.query() メソッドは、SQL の where 句スタイルでデータをフィルタリングするためのメソッドです。条件は文字列としてこのメ​​ソッドに渡すことができますが、列名にはスペースを含めることはできません。

列名にスペースが含まれている場合は、Python の replace 関数を使用してアンダースコアに置き換えます。

私の経験では、query() メソッドは、より大きな DataFrame に適用すると、以前のメソッドよりも高速であることがわかりました。

import pandas as pd movies = pd . read_csv ( "https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv" )
ログイン後にコピー
< /p>4. クエリ文字列を構築し、メソッドを実行します。

.query メソッドは、複数行にわたる三重引用符で囲まれた文字列では機能しないことに注意してください。

final_conditions = (
"original_language in [&#39;en&#39;,&#39;es&#39;]"
"and status == &#39;Released&#39; "
"and popularity > 500 "
"and popularity < 1000"
"and vote_count > 5000"
) final_result = movies . query ( final_conditions )
final_result
ログイン後にコピー

95157336zh 星724.2477842014 年 5 月 11 日78858000000#デッドプール< td>

#514.569956

movie_languages = [ &#39;en&#39; , &#39;es&#39; ]
final_conditions = (
"original_language in @movie_languages "
"and status == &#39;Released&#39; "
"and popularity > 500 "
"and popularity < 1000"
"and vote_count > 5000" )
final_result = movies . query ( final_conditions )
final_result
ログイン後にコピー

予算

id
##予算

id< /p>

original_ language

original_title

人気度

リリース日

収益

実行時間

st

165000000

##675120017

< /p>##169.0

関係

293660

zh

9 月 2 日2016

783112979

108.0

関係

# 他にもたくさんありますが、通常、私のコーディングでは、「in」句をチェックするための複数の値があります。したがって、上記の構文は理想的ではありません。 Python 変数はアットマーク (@) を使用して参照できます。

プログラムで値を Python リストとして作成し、(@) を付けて使用することもできます。

##リリース日収益実行時間st 95 157336#zh514.5699562016 年 9 月 2 日

783112979

108.0関係
#original_ language

#original_title

#人気度

165000000

zh

724.247784

2014 年 5 月 11 日

675120017

169.0

関係

788

##58000000

293660

デッドプール

p>

以上がPandas の SQL クエリ スタイルでデータのサブセットを選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:tutorialspoint.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート