如何使用条件保留特定列值的方式删除Pandas DataFrame行

时间:2019-11-25 00:44:11

标签: python pandas

我知道之前也曾问过类似的问题,但是它们似乎并没有对我的问题有所帮助,所以我决定提出一个新问题。

我拥有的是三个独立的数据框-我们将它们称为abc-合并为一个大数据框。在这三个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'

我要在其中查找重复项的特定列是(valuetarget)。如您所知,共有四种不同的重复方案:(ab),(bc),(ac,(abc)。在上面的示例中,在每种情况下都会出现的(valuetarget)对将是:(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) ,因此如果该值重复出现,我们可以保证保留该值。但是,我想知道是否有人知道(cdf)的出现方式,我们会随机选择一个,如果包含a,那么我们总是选择{ {1}}。

谢谢。

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'