Pandas 基于 groupby 和部分字符串匹配删除行

xiaoxingxing python 282

原文标题Pandas drop row based on groupby AND partial string match

我有一个带有许多列的大熊猫数据框。我想按序列号和有重复项的位置进行分组,以保留产品 ID 以-RF结尾的行。第一部分我可以用agroupby(subset='Serial Number')实现,但是我不知道如何结合它并基于正则表达式('-RF$')保留/删除行。我怎样才能做到这一点?

输入:

Serial Number Product ID
ABC1745AABC ABC-SUP2E-RF
ABC1745AABC ABC-SUP2E
ABC1745AAFF ABC-SUP2E
ABC1745AAFE ABC-SUP2E

最终,我想留下这样的东西(输出):

Serial Number Product ID
ABC1745AABC ABC-SUP2E-RF
ABC1745AAFF ABC-SUP2E
ABC1745AAFE ABC-SUP2E

数据:

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

原文链接:https://stackoverflow.com//questions/71463034/pandas-drop-row-based-on-groupby-and-partial-string-match

回复

我来回复
  • aaossa的头像
    aaossa 评论

    您可以添加一列来标记以“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"]]
    

    输出:

      Serial Number    Product ID
    2  ABC1745AAFF      ABC-SUP2E
    3  ABC1745AAFE      ABC-SUP2E
    0  ABC1745AABC   ABC-SUP2E-RF
    
    2年前 0条评论
  • enke的头像
    enke 评论

    创建一个布尔掩码,对于每一行,如果它是唯一的或以“RF”结尾,则为 True;否则为假:

    out = df[df.groupby('Serial Number')['Product ID'].transform('count').eq(1) | df['Product ID'].str.endswith('-RF')]
    

    输出:

      Serial Number    Product ID
    0   ABC1745AABC  ABC-SUP2E-RF
    2   ABC1745AAFF     ABC-SUP2E
    3   ABC1745AAFE     ABC-SUP2E
    
    2年前 0条评论