從一個Dataframe 檢索從另一個Dataframe 中排除的行
在pandas 中,通常存在多個具有潛在重疊資料的Dataframe。經常出現的一項任務是將一個資料幀中不存在於另一資料幀中的行隔離出來。此操作在處理子集或過濾資料時特別有用。
問題表述:
給定兩個pandas 資料幀,其中df1 包含與df2 相比的行的超集,我們的目標是取得df1 中在df2 中找不到的行。下面的範例用一個簡單的案例說明了這種情況:
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 和 df2,同時確保保留 df1 中的所有行。此外,我們還包括一個指示符列來識別合併後每行的來源。透過利用 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 和df2.drop_duplicates()。此操作會根據列 col1 和 col2 中的符合值將 df1 中的行與 df2 中的行合併。~df1.col1.isin(common.col1) & ~df1.col2.isin(common.col2)
指示器參數設定為 True 以包含名為 _merge 的額外列在產生的資料幀 df_all 中。此列指示每行的來源:「both」表示 df1 和 df2 中都存在的行,「left_only」表示 df1 獨有的行,「right_only」表示 df2 獨有的行。
按 'left_only' 過濾: 為了隔離 df1 中不在 df2 中的行,我們過濾df_all 資料幀,透過檢查 _merge 等於「left_only」的行。這給了我們想要的結果。 避免常見陷阱:需要注意的是,某些解決方案可能會錯誤地檢查單一列值而不是匹配行作為一個整體。這種方法可能會導致不正確的結果,如下例所示:此程式碼不考慮行中值的聯合出現,並且當df1 中的行具有單獨出現的值時可能會產生不正確的結果在df2 中,但不在同一行中。 透過採用上述左連接方法,我們確保派生行被正確辨識為 df1 獨有的。這項技術提供了一種可靠且高效的解決方案來提取一個資料幀中存在但另一個資料幀中不存在的行。以上是如何有效地從一個 Pandas DataFrame 中提取另一個 Pandas DataFrame 中不存在的行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!