簡體   English   中英

如何刪除 Pandas DF 中的行,其中 A 列的值位於 B 列和 C 列匹配

[英]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')

我會將任務分為兩個步驟

  1. map 每item都交給它的owner
  2. 根據步驟 1 應用 boolean 掩碼進行過濾

第 1 步: map ownersitems 我們可以用字典來做到這一點。 假設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.

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