[英]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個數據框中的A
, B
, C
, D
列A
,以便刪除在任何列中都不匹配10
的行。
在這種情況下,我希望它刪除第201
和202
行,因為沒有匹配項,第200
和203
行有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.