![](/img/trans.png)
[英]Selecting rows from DF1 where column values match values from a column from DF2
[英]How to remove rows in Pandas DF where value from Column A is in Column B and Column C Match
我有一個包含一些用戶/文件信息的數據框。 例如:
| Scanned_Item | Matched_Item | Owner_Name |
| item 1 | item 2 | owner 1 |
| item 1 | item 3 | owner 1 |
| item 3 | item 1 | owner 2 |
我有幾千件物品。 Matched_Items 可能不是 Scanned_Item。 我想要做的是刪除 Scanned_Item 和 Matched_Item 都屬於同一個人的所有行。
我想要的 output 是一個 DF,沒有所有者與他自己的項目匹配,從而消除了自我重復。 我只想查看所有者匹配其他人文件的行。
相當於說如果 Matched_Item 存在於 Scanned_Item 中,並且 Matched_Item 的 Owner_Name = Scanned_Item 的 Owner_Name。
(匹配是基於與此問題無關的其他預定標准形成的。
編輯:這是我現在寫的,但它需要永遠,不確定這是否表明它不起作用哈。
for index, row in df.iterrows():
for index2, row2 in df.iterrows():
if row['Scanned_Workbook'] == row2['Matched_Workbook'] and row['Full Name'] == row2['Full Name']:
df.drop(index,errors='ignore')
df.drop(index2,errors='ignore')
Edit2:作為補充細節,因為似乎存在一些清晰度問題。 所有已掃描和匹配的項目都來自相同的原始數據源。 我通過迭代我的原始數據集並使用 Python 集合理解來查找三個條件匹配的文件,找到了匹配項。
所以項目 1 被掃描並與項目 2 匹配 3 個條件,這就是第一行的來源。 但由於我是如何理解的,我只有 Scanned_Items 的所有者名稱,而不是 Matched_Items。
我正在嘗試刪除 Scanned_Item 和 Matched_Item 都屬於同一所有者的所有行。
這有助於清晰嗎?
Edit3:這是一個將被刪除的行的示例。
| Scanned_Item | Matched_Item | Owner_Name |
| item 1 | item 2 | owner 1 |
| item 2 | item 1 | owner 1 |
因為第 1 項和第 2 項都在某個時間點進行了掃描,所以它們相互匹配。 但它們也有相同的所有者。 我想刪除任何看起來像這樣的行。
所有者名稱與掃描的項目相關聯。 所以我能找到匹配項目所有者的唯一方法是它是否出現在掃描列中。
如果我理解得很好,您需要刪除重復項。
如果要刪除所有這些行,為什么不簡單地編寫以下內容:
new_df = df.drop_duplicates(keep=False)
如果您想保留至少一個重復項,只需更改參數的值:
new_df = df.drop_duplicates(keep='first')
我會將任務分為兩個步驟
item
都交給它的owner
第 1 步: map owners
到items
。 我們可以用字典來做到這一點。 假設Matched_Item
是與Owner_Name
關聯的項目,
df_owner_items = df[["owner_name", "matched_item"]]. \
drop_duplicates(). \ # We select only non duplicated records
set_index("matched_item") \ # We set index to use the `from_dict` method later in the most useful way
owner_items_dict = df_owner_items.to_dict(orient="index") # Our dataframe is transformed in a dictionary having format {"item1": {"owner_name": "owner 1"}}
第 2 步:創建 boolean 掩碼和過濾器
filter = (df["owner_name"] != owner_items_dict["matched_item"]["owner_name"])
filtered_df = df.loc[filter]
希望這可以幫助。
走了一條不同的路線來解決這個問題。 我剛剛加入了原始數據集並找到了matched_items 的所有者,因此我可以在單獨的列中同時掃描和匹配所有者。 然后,使用 df.query 刪除兩個所有者值匹配的所有行。
這解決了我的問題,感謝所有回答/評論的人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.