2013-02-19 13 views
6

Mam pandas DataFrame z duplikatami wartości dla zestawu kolumn. NpJak zidentyfikować pierwsze wystąpienie duplikatów wierszy w Pandonie Pythona 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 

rząd (1) i (3) są takie same. Zasadniczo wiersz (3) jest duplikatem wiersza (1).

szukam następujące dane wyjściowe:

Is_Duplicate zawierający czy wiersz jest duplikatem lub nie [może być dokonane za pomocą „kopiowane” metody na kolumnach dataframe (Kolumna2, kolumna3 i Column4)]

Dup_Index oryginalny indeks duplikatu wiersza.

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 

Odpowiedz

11

Istnieje metoda dataFrame duplicated dla pierwsza kolumna:

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']) 

Aby zrobić drugie można spróbować coś takiego:

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

Jak masz swój DF1? –

+0

@RutgerKassies dobre pytanie! Tęskniłem trochę ... –

+0

Dzięki, bardzo eleganckie rozwiązanie. –

3

Załóżmy, że dataframe jest przechowywany w df.

Możesz użyć groupby, aby uzyskać niepowielone wiersze twojej ramki danych. Tutaj mamy ignorować COLUMN1, który nie jest częścią danych:

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

można następnie scalić tę nową dataframe z pierwotnego za pomocą merge funkcję:

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

Można ostatecznie używania zamówienia _dupindex kolumny połączyły się w dataframe dokonać prostej matematyki, aby dodać kolumny potrzebne:

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'] 
Powiązane problemy