我有数据:
item colour machine
0 car red a
1 car red b
2 car green b
3 car blue a
4 moto yellow a
5 moto red a
6 bike blue a
7 bike blue b
8 bike green a
我正在尝试仅将具有记录的项保留在机器a和b上。我尝试了一些在Internet上找到的功能,但是这些功能不起作用,因此我必须手动使用data.drop()
进行操作。是否存在执行该功能的功能?结果dataframe
应该是:
item colour machine
0 car red a
1 car red b
2 bike blue a
3 bike blue b
谢谢!
答案 0 :(得分:1)
将GroupBy.transform
与自定义lambda函数一起使用,以比较转换为tuple
,list
的值,然后在boolean indexing
中进行过滤:
如果有必要,也可以不确定订单是否总是a,b
进行首次排序:
df = df.sort_values(['item','colour','machine'])
f = lambda x: tuple(x) == tuple(['a','b'])
#alternative
f = lambda x: list(x) == list(['a','b'])
#solution if want compare and remove duplicates
#f = lambda x: set(x) == set(['a','b'])
df = df[df.groupby(['item','colour'])['machine'].transform(f)]
print (df)
item colour machine
0 car red a
1 car red b
6 bike blue a
7 bike blue b