簡體   English   中英

Pandas 根據 groupby AND 部分字符串匹配刪除行

[英]Pandas drop row based on groupby AND partial string match

我有一個很大的 pandas DataFrame,其中有很多列。 我想按序列號和重復項分組,以保留產品 ID 以-RF結尾的行。 第一部分我可以用groupby(subset='Serial Number')實現,但是我不知道如何結合這個和基於正則表達式('-RF$')保留/刪除行。 我怎樣才能做到這一點?

輸入:

序列號 產品編號
ABC1745AABC ABC-SUP2E-射頻
ABC1745AABC ABC-SUP2E
ABC1745AAFF ABC-SUP2E
ABC1745AAFE ABC-SUP2E
ABC1745AAB1 ABC-SUP2E-WS
ABC1745AAB1 ABC-SUP2E

最終,我想留下這樣的東西(輸出):

序列號 產品編號
ABC1745AABC ABC-SUP2E-射頻
ABC1745AAFF ABC-SUP2E
ABC1745AAFE ABC-SUP2E
ABC1745AAB1 ABC-SUP2E-WS
ABC1745AAB1 ABC-SUP2E

數據:

{'Serial Number': ['ABC1745AABC', 'ABC1745AABC', 'ABC1745AAFF', 'ABC1745AAFE'],
 'Product ID': ['ABC-SUP2E-RF', 'ABC-SUP2E', 'ABC-SUP2E', 'ABC-SUP2E']}

您可以添加一列來標記以“RF”結尾的行,然后對值進行排序以將這些行留在每個組的頂部。 最后只是分組並占據第一行:

df["RF"] = df["Product ID"].str.endswith("-RF")
df = df.sort_values(["Serial Number", "RF"], ascending=False)
output = df.groupby("Serial Number").first()[["Serial Number", "Product ID"]]

Output:

  Serial Number    Product ID
2  ABC1745AAFF      ABC-SUP2E
3  ABC1745AAFE      ABC-SUP2E
0  ABC1745AABC   ABC-SUP2E-RF

謝謝你的幫助。 我已經這樣解決了:

df = df.sort_values(["序列號", "產品 ID"], ascending=(True, True))

df = df.drop_duplicates(subset=['序列號', '產品組'], keep='第一個')

幸運的是,我保留的產品 ID 在所有情況下都是最長的字符串。 最好為情況並非總是如此的情況找到解決方案。

暫無
暫無

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

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