Pandas 基于 groupby 和部分字符串匹配删除行
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']}
回复
我来回复-
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年前 -
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年前