我想从一个数据帧中删除重复项,给出一些相当精细的编码。考虑数据框
df = pd.DataFrame({'id' : [1, 1, 1, 1, 2, 2, 2, 3, 3],
'dup' : [1, 2, 2, 2, 3, 4, 4, 5, 5],
'a' : [False, True, False, True, False, True, False, False, False],
'b' : [False, False, True, True, False, False, False, False, False],
'data' : [0, 1, 2, 3, 0, 1, 2, 0, 0]})
a b data dup id
0 False False 0 1 1
1 True False 1 2 1
2 False True 2 2 1
3 True True 3 2 1
4 False False 0 3 2
5 True False 1 4 2
6 False False 2 4 2
7 False False 0 5 3
8 False False 0 5 3
id
表示哪些行属于一起,dup
是数据被视为重复的变量。因此,行0到3属于一起,行1到3是重复的。类似地,第4行到第6行属于一起,第5行和第6行是重复的等等。
我想根据以下规则删除重复项:
a
和列b
为True
,请保留该行并删除其余行。a
或列b
为True
,则保留该行并删除其余行结果框架应如下所示
a b data dup id
0 False False 0 1 1
3 True True 3 2 1
4 False False 0 3 2
5 True False 1 4 2
7 False False 0 5 3
关于两个以上重复行遵循相同规则的情况,例如
a b data dup id
0 False False 0 3 2
1 True False 1 4 2
2 False True 2 4 2
根据规则2,第1行和第2行都是真的。根据数据帧的逻辑,这些情况是不可能的。
答案 0 :(得分:2)
你在这里:
df=df.sort_values(by=['dup','a','b'],ascending=[True,False,False])
df=df.drop_duplicates(subset='dup',keep='first')
首先,我根据您的规则对行进行排序:通过dup,然后首先将True加在'a'上(也可能放在'b'上)。然后删除关于'dup'的重复行,保持第一次遇到。