あるデータフレームから別のデータフレームから除外された行を取得する
パンダでは、重複する可能性のあるデータを含む複数のデータフレームがあるのが一般的です。頻繁に発生するタスクの 1 つは、あるデータフレームから別のデータフレームに存在しない行を分離することです。この操作は、サブセットを操作する場合やデータをフィルター処理する場合に特に便利です。
問題の定式化:
2 つの pandas データフレームがあり、df1 には df2 と比較した行のスーパーセットが含まれているとします。 df2 では見つからない行を df1 で取得することを目的としています。以下の例は、このシナリオを簡単なケースで示しています。
import pandas as pd df1 = pd.DataFrame(data={'col1': [1, 2, 3, 4, 5], 'col2': [10, 11, 12, 13, 14]}) df2 = pd.DataFrame(data={'col1': [1, 2, 3], 'col2': [10, 11, 12]}) print(df1) print(df2) # Expected result: # col1 col2 # 3 4 13 # 4 5 14
解決策:
この問題に効果的に対処するために、左結合として知られる手法を採用します。この操作は、df1 からのすべての行が確実に保持されるようにしながら、df1 と df2 をマージします。さらに、マージ後の各行の起点を識別するためのインジケーター列が含まれています。 df2 からの一意の行を活用し、重複を除外することで、望ましい結果が得られます。
以下の Python コードは、このソリューションを実装しています。
df_all = df1.merge(df2.drop_duplicates(), on=['col1', 'col2'], how='left', indicator=True) result = df_all[df_all['_merge'] == 'left_only']
説明:
一般的な落とし穴の回避:
一部のソリューションでは、一致するのではなく、個々の列の値が誤ってチェックされる可能性があることに注意することが重要です。全体としての行。このようなアプローチでは、以下の例に示すように、不正確な結果が生じる可能性があります。
~df1.col1.isin(common.col1) & ~df1.col2.isin(common.col2)
このコードでは、行内の値の同時出現が考慮されていないため、df1 の行に個別に出現する値がある場合、不正確な結果が生成される可能性があります。
上記の左結合アプローチを採用することで、派生行が df1 専用のものとして正しく識別されるようになります。この手法は、あるデータフレームには存在するが別のデータフレームには存在しない行を抽出するための信頼性の高い効率的なソリューションを提供します。
以上がある Pandas DataFrame から別の Pandas DataFrame に存在しない行を効率的に抽出する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。