2017-09-15 6 views
0

かなり精巧なコードを与えて、データフレームから重複を削除したいと思います。Pythonの複数の中断条件に応じて重複を削除してください

df = pd.DataFrame({'id' : [1, 1, 1, 1, 2, 2, 2, 3, 3], 
        'dup' : [1, 2, 2, 2, 3, 4, 4, 5, 5], 
        'a' : [False, True, False, True, False, True, False, False, False], 
        'b' : [False, False, True, True, False, False, False, False, False], 
        'data' : [0, 1, 2, 3, 0, 1, 2, 0, 0]}) 


     a  b data dup id 
0 False False  0 1 1 
1 True False  1 2 1 
2 False True  2 2 1 
3 True True  3 2 1 
4 False False  0 3 2 
5 True False  1 4 2 
6 False False  2 4 2 
7 False False  0 5 3 
8 False False  0 5 3 

idが一緒に属しているとdupは、データが重複したとみなされるに可変である行を示すデータフレームを考えてみましょう。したがって、行0〜3は一緒に属し、行1〜3は重複します。そして、と似列4〜6は一緒に属し、行5及び6等重複し

Iは、以下の規則に従って、重複を削除する:

  1. 行が存在する場合、その結果列の両方a AND列bTrueであり、その行を保持して残りの部分を削除します。
  2. EITHER列aまたは列bが重複行の1つを保持し、その行を保持し、いずれも1または2が発生した場合
  3. 残りをドロップ、Trueあるような行が存在する場合、条件1は、起こらない場合。それはどちらの問題ではない。

得られたフレームは、二つ以上の重複する行が行1及び2の両方が真で記載されているこの

 a  b data dup id 
0 False False  0 3 2 
1 True False  1 4 2 
2 False True  2 4 2 

ように同じ規則に従う場合についてこの

 a  b data dup id 
0 False False  0 1 1 
3 True True  3 2 1 
4 False False  0 3 2 
5 True False  1 4 2 
7 False False  0 5 3 

ようになりますこれらのケースは、データフレームにつながる論理に基づいては不可能です。

答えて

2

ここでは、次のとおりです。

df=df.sort_values(by=['dup','a','b'],ascending=[True,False,False]) 
df=df.drop_duplicates(subset='dup',keep='first') 

まず、私はあなたのルールに関して行をソート:DUPによって、その後、(あまりにも「B」に、おそらくと)「A」に最初の真を持つものを置きます。最初に出会った 'dup'に関して重複した行をドロップします。

+1

ニース!短くて甘い。ありがとうございました。 – mortysporty

関連する問題