2016-09-22 5 views
1

Angesichts der folgenden Datenrahmen:Pandas Label-Dubletten

import pandas as pd 
d=pd.DataFrame({'label':[1,2,2,2,3,4,4], 
       'values':[3,5,7,2,5,8,3]}) 
d 
    label values 
0  1  3 
1  2  5 
2  2  7 
3  2  2 
4  3  5 
5  4  8 
6  4  3 

Ich weiß, wie die einzigartigen Werte wie folgt zählen:

d['dup']=d.groupby('label')['label'].transform('count') 

was zur Folge hat:

label values dup 
0  1  3  1 
1  2  5  3 
2  2  7  3 
3  2  2  3 
4  3  5  1 
5  4  8  2 
6  4  3  2 

Aber was Ich möchte, dass eine Spalte die folgenden Werte hat: 1 wenn dort ist 1 unique Zeile pro der Spalte Label, 2 wenn es duplicates und die betreffende Zeile ist die first von solchem, und 0, wenn die Zeile ein duplicate eines Originals ist. Gefällt mir:

label values dup status 
0  1  3  1  1 
1  2  5  3  2 
2  2  7  3  0 
3  2  2  3  0 
4  3  5  1  1 
5  4  8  2  2 
6  4  3  2  0 

Vielen Dank im Voraus!

Antwort

5

Ich glaube, Sie loc mit Bedingung von Funktion erstellt verwenden können duplicated:

d['status'] = 2 
d.loc[d.dup == 1, 'status'] = 1 
d.loc[d.label.duplicated(), 'status'] = 0 
print (d) 

    label values dup status 
0  1  3 1  1 
1  2  5 3  2 
2  2  7 3  0 
3  2  2 3  0 
4  3  5 1  1 
5  4  8 2  2 
6  4  3 2  0 

Oder Doppel numpy.where:

d['status1'] = np.where(d.dup == 1, 1, 
       np.where(d.label.duplicated(), 0, 2)) 

print (d) 
    label values dup status status1 
0  1  3 1  1  1 
1  2  5 3  2  2 
2  2  7 3  0  0 
3  2  2 3  0  0 
4  3  5 1  1  1 
5  4  8 2  2  2 
6  4  3 2  0  0   
+0

Ich mag die Doppel 'where', hast du meine Stimme :) – IanS

+0

@IanS - Danke. ;) – jezrael

+0

Perfekt. Vielen Dank! –

1

Eine weitere Option ist die Zählspalte bei 2 zu befestigen, dann subtrahiert entfernt 2 mal duplicated. Da duplicated standardmäßig keep='first' verwendet, werden alle außer der ersten doppelten Beschriftung auf Null reduziert.

d['status'] = d['dup'].clip_upper(2) - 2*d.duplicated(subset='label') 

Die resultierende Ausgabe:

label values dup status 
0  1  3 1  1 
1  2  5 3  2 
2  2  7 3  0 
3  2  2 3  0 
4  3  5 1  1 
5  4  8 2  2 
6  4  3 2  0