2013-02-19 4 views
6

Ich habe eine Pandas DataFrame mit doppelten Werten für eine Reihe von Spalten. Zum Beispiel:Wie das erste Vorkommen von doppelten Zeilen in Python Pandas zu identifizieren ist Dataframe

df = pd.DataFrame({'Column1': {0: 1, 1: 2, 2: 3}, 'Column2': {0: 'ABC', 1: 'XYZ', 2: 'ABC'}, 'Column3': {0: 'DEF', 1: 'DEF', 2: 'DEF'}, 'Column4': {0: 10, 1: 40, 2: 10}) 

In [2]: df 
Out[2]: 
    Column1 Column2 Column3 Column4 is_duplicated dup_index 
0  1  ABC  DEF  10   False   0 
1  2  XYZ  DEF  40   False   1 
2  3  ABC  DEF  10   True   0 

Row (1) und (3) sind gleich. Im Wesentlichen ist Zeile (3) ein Duplikat von Zeile (1).

ich für die folgende Ausgabe suchen:

Is_Duplicate, enthalten, ob die Zeile ein Duplikat ist oder nicht

[kann mit „dupliziert“ Methode auf Datenrahmen Säulen (Column2, Column3 und Column4) erreicht werden]

Dup_Index der ursprüngliche Index der doppelten Zeile.

In [3]: df 
Out[3]: 
    Column1 Column2 Column3 Column4 Is_Duplicate Dup_Index 
0  1  ABC  DEF  10   False   0 
1  2  XYZ  DEF  40   False   1 
2  3  ABC  DEF  10   True   0 

Antwort

11

Es ist ein Datenrahmen Methode duplicated für die erste Spalte:

In [11]: df.duplicated(['Column2', 'Column3', 'Column4']) 
Out[11]: 
0 False 
1 False 
2  True 

In [12]: df['is_duplicated'] = df.duplicated(['Column2', 'Column3', 'Column4']) 

die zweite tun Sie so etwas wie dies versuchen könnte:

In [13]: g = df.groupby(['Column2', 'Column3', 'Column4']) 

In [14]: df1 = df.set_index(['Column2', 'Column3', 'Column4']) 

In [15]: df1.index.map(lambda ind: g.indices[ind][0]) 
Out[15]: array([0, 1, 0]) 

In [16]: df['dup_index'] = df1.index.map(lambda ind: g.indices[ind][0]) 

In [17]: df 
Out[17]: 
    Column1 Column2 Column3 Column4 is_duplicated dup_index 
0  1  ABC  DEF  10   False   0 
1  2  XYZ  DEF  40   False   1 
2  3  ABC  DEF  10   True   0 
+0

Wie bekommen Sie Ihre df1? –

+0

@RutgerKassies gute Frage! Ich habe ein bisschen verpasst ... –

+0

Danke, sehr elegante Lösung. –

3

Angenommen, Ihr Datenrahmen ist in df gespeichert.

Sie können groupby verwenden, um nicht duplizierte Zeilen Ihres Dataframes zu erhalten. Hier müssen wir Column1 ignorieren, die nicht Teil der Daten ist:

df_nodup = df.groupby(by=['Column2', 'Column3', 'Column4']).first() 

Sie können dann diese neuen Datenrahmen mit dem Original verschmelzen mithilfe der merge Funktion:

df = df.merge(df_nodup, left_on=['Column2', 'Column3', 'Column4'], right_index=True, suffixes=('', '_dupindex')) 

Sie können schließlich die Verwendung _dupindex Spalte verschmolzen in der Datenrahmen die einfache mathematische machen die Spalten benötigt hinzuzufügen:

df['Is_Duplicate'] = df['Column1']!=df['Column1_dupindex'] 
df['Dup_Index'] = None 
df['Dup_Index'] = df['Dup_Index'].where(df['Column1_dupindex']==df['Column1'], df['Column1_dupindex']) 
del df['Column1_dupindex'] 
Verwandte Themen