我知道之前也曾问过类似的问题,但是它们似乎并没有对我的问题有所帮助,所以我决定提出一个新问题。
我拥有的是三个独立的数据框-我们将它们称为a
,b
和c
-合并为一个大数据框。在这三个DataFrame的每一个中,可能有重复的列值对我想删除,但是条件是,如果该对值属于DataFrame c
,那么我想保留该对。例如:
>>> a.head()
unit value target
0 3 23 'a'
1 2 24 'd'
2 8 56 'e'
3 9 89 'p'
4 0 32 'q'
>>> b.head()
unit value target
0 3 34 'a'
1 2 36 'd'
2 8 23 'a'
3 9 89 'p'
4 0 48 'm'
>>> c.head()
unit value target
0 3 34 'a'
1 5 23 'a'
2 2 48 'm'
3 9 56 'e'
4 0 98 'z'
我要在其中查找重复项的特定列是(value
,target
)。如您所知,共有四种不同的重复方案:(a
,b
),(b
,c
),(a
, c
,(a
,b
,c
)。在上面的示例中,在每种情况下都会出现的(value
,target
)对将是:(89
,'p'
),(34
,分别为'a'
,{{1},56
)和{{1},'e'
)。
如果重复出现在(23
,'a'
)中,这不是一个大问题,因为我可以简单地从其中之一中进行选择,但是如果它出现在其他三种情况中的任何一种中,我想要从a
中选择一对,并丢弃b
和/或c
中的重复项。
我最初的想法是使用以下代码:
a
由于我们要在串联的DataFrame b
的末尾添加>>> df = pd.concat([a, b, c], axis=0)
>>> df.drop_duplicates(subset=['value', 'target'], keep='last', inplace=True)
,因此如果该值重复出现,我们可以保证保留该值。但是,我想知道是否有人知道(c
,df
)的出现方式,我们会随机选择一个,如果包含a
,那么我们总是选择{ {1}}。
谢谢。
答案 0 :(得分:0)
在结合sample
之前,我们可以使用c
a_b=pd.concat([a,b]).sample(n=len(a)+len(b))
new=pd.concat([a_b,c]).drop_duplicates(['value', 'target'], keep='last')
new
Out[11]:
unit value target
1 2 24 'd'
4 0 32 'q'
3 9 89 'p'
1 2 36 'd'
0 3 34 'a'
1 5 23 'a'
2 2 48 'm'
3 9 56 'e'
4 0 98 'z'