2017-10-04 156 views
2

我想对两列的数据框执行条件检查,如下所示:任何列的内容都不能在另一列中,除非两个值相等 - 可以有没有两个列中存在值并且值不相等的实例。条件测试和比较熊猫数据框中的两列

在例如下面,条件得到满足。虽然alternahaircare.com在两个栏目 - 域名和credit_domain中,唯一的情况发生时,两个值都是相同的。

Out[198]: df 
          domain    credit_domain 
2    alternahaircare.com   alternahaircare.com 
3 alternahaircare.myshopify.com   alternahaircare.com 
4   shop.alternahaircare.com   alternahaircare.com 
5     americancrew.com   americancrew.com 

下面是我想要满足的条件不符合上述的两个修改的例子:

在这其中,你可以看到,有一列其中domain = alternahaircare和credit_domain = americancrew .COM。这是错误的 - 现在alternahaircare.com发生在两列中,但有一个实例中credit_domain列中的值与域列不匹配。

Out[199]: df 
          domain    credit_domain 
2    alternahaircare.com   americancrew.com 
3 alternahaircare.myshopify.com   alternahaircare.com 
4   shop.alternahaircare.com   alternahaircare.com 
5     americancrew.com   americancrew.com 

下面的实例也是错的 - 不符合我想满足的条件。虽然有alternahaircare.com的实例== alternahaircare.com,还存在被分配给值alternahaircare.com的实例,它是本身没有即americacrew.com

Out[198]: df 
          domain    credit_domain 
2    alternahaircare.com   alternahaircare.com 
3 alternahaircare.myshopify.com   alternahaircare.com 
4   shop.alternahaircare.com   alternahaircare.com 
5    alternahaircare.com   americancrew.com 

的这些问题的第二可以通过检查域值的计数和识别出现两次的任何事情来轻松解决。

第一个问题让我困惑。我的方法是找出潜在的问题行,然后尝试使用GROUPBY和条件语句:

potential_error_rows = df[df.credit_domain.isin([x for x in df.credit_domain.tolist() if x in df.domain.tolist()])] 

想不出做什么超越这个!

回答

1

如果我正确地要列之间理解映射,你可以简单地检查是否有domain对应于两个

  • 是在credit_domain
  • 不等于自己的行值的任何行在credit_domain

像这样

def is_valid(df): 
    return ~(df.domain.isin(df.credit_domain) & 
      (df.domain != df.credit_domain)).any() 

它返回TrueFalse,并False为您例如DataFrames。

+0

我想要的东西是不好的行作为输出。不良行是信用域值在域值中的情况,但在信用域!=域中存在这种值的情况。如果您在我的问题中看到第二个示例框架:我希望结果成为domain = alternahaircare.com和credit domain = americancrew.com的行。 – vagabond

0

我很接近,并已找到了答案:

# This gives the suspect rows - rows of data where domain value is same as the list of credit_domain present in domain 
x = df[df.domain.isin([x for x in df.credit_domain.tolist() if x in df.domain.tolist()])] 

# Once I have the above, it was a simple matter of looking at those rows where domain != credit_domain 
x[x.domain != x.credit_domain]