値の範囲と識別子に基づいて Pandas データフレームを効率的にマージする方法

Linda Hamilton
リリース: 2024-10-30 11:54:02
オリジナル
238 人が閲覧しました

How to Efficiently Merge Pandas Dataframes Based on Value Range and Identifier?

値の範囲と識別子に基づいて Pandas データフレームをマージする

パンダでは、範囲ベースの条件と識別子を使用してデータフレームをマージできます。マージ操作とフィルタリング操作を組み合わせて実行します。ただし、大規模なデータセットを扱う場合、このアプローチは非効率になる可能性があります。 SQL を利用する別のアプローチにより、パフォーマンスが向上する可能性があります。

2 つのデータフレーム A と B がある例を考えてみましょう。データフレーム A には日付 (fdate) と識別子 (cusip) が含まれ、データフレーム B には日付 (namedt と nameenddt) および同じ識別子 (ncusip)。私たちの目標は、A の fdate が B の namest と nameenddt で定義された日付範囲内にあるデータフレームをマージすることです。

次の Python コードは、従来の pandas アプローチを示しています。

<code class="python">df = pd.merge(A, B, how='inner', left_on='cusip', right_on='ncusip')
df = df[(df['fdate']>=df['namedt']) & (df['fdate']<=df['nameenddt'])]</code>
ログイン後にコピー

このアプローチは機能しますが、データフレームを無条件にマージし、その後日付条件に基づいてフィルタリングする必要があるため、大規模なデータセットの場合は計算コストが高くなる可能性があります。

代替アプローチは、SQL クエリを使用することです。

<code class="python">import pandas as pd
import sqlite3

# Create a temporary database in memory
conn = sqlite3.connect(':memory:')

# Write the dataframes to tables
A.to_sql('table_a', conn, index=False)
B.to_sql('table_b', conn, index=False)

# Construct the SQL query
query = '''
    SELECT *
    FROM table_a
    JOIN table_b ON table_a.cusip = table_b.ncusip
    WHERE table_a.fdate BETWEEN table_b.namedt AND table_b.nameenddt
'''

# Execute the query and create a Pandas dataframe
df = pd.read_sql_query(query, conn)</code>
ログイン後にコピー

このアプローチにはいくつかの利点があります:

  • 実行の高速化: SQL はデータ処理用に最適化されており、範囲ベースのフィルタリングがより効率的になります。
  • 中間データの回避: フィルタリングされたデータは、大規模な中間データフレームを作成せずに直接抽出されます。
  • シンプルさ: クエリは簡潔で理解しやすいです。

結論として、SQL を活用して範囲ベースの条件と識別子に基づいてデータフレームをマージすると、特に大規模なデータセットの場合、従来の Pandas 操作よりもパフォーマンス上の利点が得られます。

以上が値の範囲と識別子に基づいて Pandas データフレームを効率的にマージする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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