簡體   English   中英

Python / Pandas:比較兩個數據框中的多列,如果找不到匹配項,則刪除行

[英]Python/Pandas: Compare multiple columns in two dataframes and remove row if no matches found

我正在使用Pandas學習Python,並嘗試找出最有效的方法來比較2個數據幀上的多個選定列以找到匹配項。 例如,如果我有以下兩個數據框:

Frame 1
      A     B    C    D    E    F    
001   10    0    0    10   0    10


Frame 2
      A     B    C    D    E    F
200   10    0    10   0    10   0
201   0     10   10   0    0    10
202   0     10   0    0    0    0
203   0     0    0    10   0    10

我正在尋找一種比較2個數據框中的ABCDA ,以便刪除在任何列中都不匹配10的行。

在這種情況下,我希望它刪除第201202行,因為沒有匹配項,第200203行有1個匹配項(即使第200行有1個不匹配的列)。

我嘗試遍歷第2幀中的所有行,比較

letters = ['A', 'B', 'C', 'D']

for ix, row in frame_2():
    for letter in letters:
        if frame_1[letter].values[0] != frame_2.loc[ix, letter]:
            frame_2.drop(ix, inplace=True)
            break

這刪除了一些行,但不是全部。

有沒有一種有效的方法可以遍歷所有行並檢查另一個數據框的任何列中是否有單個匹配項?

先謝謝您的幫助!

我認為最簡單的解決方案是將df1一個非10值替換為df2另一個值,將每列與isin進行比較,以便在df1具有更多行的情況下比較更多值,創建boolean DataFrame, concat並按any進行過濾以測試至少一個True每行:

letters = ['A', 'B', 'C', 'D']

out = []
for letter in letters:
    m = df2[letter].mask(lambda x: x!=10, 0).isin(df1[letter].mask(lambda x: x!=10, 1))
    out.append(m)

df = df2[pd.concat(out, axis=1).any(axis=1)]

替代解決方案:

df = df2[np.logical_or.reduce(out)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM