2016-09-22 11 views
1

列['b']内のすべての行を調べ、行が空でない場合は、対応する別の列['c']に移動し、この特定のインデックスを保持しながら、その第3列['c']の他のすべての行に対してインデックスを作成します。私はdrop_duplicatesに遭遇しましたが、列内のすべての重複とは対照的に、強調表示された行の重複を探す方法を見つけることができませんでした。列全体のdrop_duplicatesを使用することはできません。なぜなら、列['b']の空の値だけに対応するこの列に重複を保持したいからです。python pandas重複を選択的に削除する方法

['b']で空の値が見つからない場合、['c']の現在のインデックスに行き、その1つのインデックスのすべての重複を見つけて削除することができます。これらの重複は、['b']の空のOR空でない値に対応する可能性があります。 ['b']で空の値が見つかった場合は、次のインデックスにスキップしてください。このように、['b']の空の値インデックスは、空でない['b']値に対応する['c']のインデックスの重複であるため、間接的に削除される可能性があります。

サンプルデータで編集:

は、前処理:

df1 = pd.DataFrame([['','CCCH'], ['CHC','CCCH'], ['CCHCC','CNHCC'], ['','CCCH'], ['CNHCC','CNOCH'], ['','NCH'], ['','NCH']], columns=['B', 'C']) 

df1 

    B  C 
0   CCCH 
1 CHC CCCH 
2 CCHCC CNHCC 
3   CCCH 
4 CNHCC CNOCH 
5   NCH 
6   NCH 

ポストプロセッシングと正しい重複を落とす:

df2 = pd.DataFrame([['CHC','CCCH'], ['CCHCC','CNHCC'], ['CNHCC','CNOCH'], ['','NCH'], ['','NCH']], columns=['B', 'C']) 

df2 

    B  C 
1 CHC CCCH 
2 CCHCC CNHCC 
4 CNHCC CNOCH 
5   NCH 
6   NCH 

私たちの上には、削除された行のみが行0だったという結果を参照してください、 3であり、これは、非ゼロの「B」値を有する行1の列「 'C'」において重複しているからである。行5,6は、カラム '[C']にお互いが重複していても保持されます。なぜなら、それらはゼロ以外の 'B'値を持たないからです。行2と列4は列['C']に重複していないため、保持されます。

したがって、ロジックが空の場合は列 'B'の各行を通過し、行を下に移動して続行することになります。空でない場合は、対応する列 'C'に行き、その列 'C'行の重複をそのインデックスを保持したままでドロップし、この論理が列 'Bのすべての値に適用されるまで'

カラムB値空 - >カラムBの次の値を参照

|または空でない場合|

列Bない空 - >コラムC - >現在のインデックスを維持しながら、列Cのそのインデックスのすべての重複をドロップします - >列B内の次の値を見

+3

あなたは、いくつかのデータサンプルを提供していただけますか? (http://stackoverflow.com/help/mcve) – Thanos

+1

そして:[良い再現可能なパンダの例を作る方法](http:// stackoverflow。com/questions/20109391/how-to-make-good-reproducible-pandas-examples) – IanS

+0

データ例で編集 – lucas305

答えて

0

はあなたがグループあなたのデータフレームは応じ言います'C'カラムに、そして'B' -column非空きエントリが存在する各グループをチェック:

  • そうでなければそのようなエントリがない場合

    • は、グループ全体を返し、戻り'B'で空でないエントリのグループ、重複がコードで

    を落として:

    def remove_duplicates(g):          
        return g if sum(g.B == '') == len(g) else g[g.B != ''].drop_duplicates(subset='B') 
    
    >>> df1.groupby(df1.C).apply(remove_duplicates)['B'].reset_index()[['B', 'C']] 
         B  C 
    0 CHC CCCH 
    1 CCHCC CNHCC 
    2 CNHCC CNOCH 
    3   NCH 
    4   NCH 
    
  • +0

    これは非常に有望です - ありがとうございます!しかし、私はいくつかのエラーに遭遇しています: 'ValueError:labels [' level_1 ']は軸に含まれていません'。私はそれを実行した方法はdf2 = df1.groupbyを行うことでした......それは間違っていますか? – lucas305

    +0

    @ lucas305なぜそれが得られたのか分かりませんが、 'level_1'の部分は実際には重複していて、削除しました。上記のアップデートに従ってもう一度お試しいただけますか? –

    +0

    さようなら!それは間違いなく走った。しかし、私が必要とする出力はあまりありません。あまりにも多くの情報が失われています。したがって、元のdfでは、各行は、その行の特定のデータに対応する分子識別子によって索引付けされます。これは、インデックスが0からnまでの整数になっているので、変換後に失われています。また、新しいdfのポスト変換には、列BとCのみがあり、他の列はすべて削除されています。私は他のすべての情報を保持する必要があります。基本的には重複を削除するだけですが、それ以外はすべて同じにしておきます。 – lucas305

    関連する問題