2017-10-04 14 views
2

2つの列を持つデータフレームで条件チェックを実行しようとしています。両方の値が等しい場合を除いて、どちらの列の内容も他の列にはありません値が両方の列に存在し、値が等しくないインスタンスはありません。条件付きテストとpandasデータフレームの2つの列の比較

以下の場合、条件が満たされます。 alternahaircare.comはdomainと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 

以下は、私が満足する条件が満たされていない上記の2つの変形例を示します。

この一

、あなたが行があることがわかりますが、どこのドメイン= alternahaircareとcredit_domain = americancrew .com。これは間違っています - 今度はalternahaircare.comが両方の列で発生しますが、credit_domain列の値がドメイン列と一致しない場合があります。

以下の例も間違っています。私が満足したい条件を満たしていません。 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 

自体ない値に、これらの問題の第二の割り当てられalternahaircare.comのインスタンスもありますドメイン値の数をチェックし、2回発生するものを特定することで簡単に対処できます。

最初の問題は私を混乱させます。

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

はこれ以上何をすべきかを考えることができませんでした:私のアプローチは、潜在的な問題の行を識別し、その後GROUPBYや条件文を使用して試してみました!

答えて

1

私はあなたが列の間にしたいことを正確にマッピングを理解していれば、その行の値に等しくないcredit_domain

  • であることの両方

    • に対応domain内の任意の行がある場合は、単に確認することができますcredit_domainにあります。あなたの例のデータフレームのためのTrueFalse、およびFalseを返しますので、

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

      よう

  • +0

    私は出力として悪い行だった何を望むかを。悪い行は、クレジットドメイン値がドメイン値にあるが、クレジットドメイン!=ドメインのような値の場合がある場合です。私の質問に2番目の例のフレームが表示された場合:結果は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] 
    
    関連する問題