2013-02-19 35 views
6

Tôi có một DataFrame gấu trúc với các giá trị trùng lặp cho một tập hợp các cột. Ví dụ:Cách xác định sự xuất hiện đầu tiên của các hàng trùng lặp trong chú gấu trúc Python 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 

Hàng (1) và (3) giống nhau. Về cơ bản, Row (3) là một bản sao của Row (1).

Tôi đang tìm kiếm đầu ra sau đây:

Is_Duplicate, chứa dù hàng là một bản sao hay không [có thể được thực hiện bằng cách sử dụng phương pháp "nhân đôi" trên các cột dataframe (--COLUMN2, cột3 và Column4)]

Dup_Index chỉ mục gốc của hàng trùng lặp.

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 

Trả lời

11

có một phương pháp dataFrame duplicated cho cột đầu tiên:

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

Để thực hiện điều thứ hai bạn có thể thử một cái gì đó như thế này:

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

Làm thế nào để bạn có được df1 của bạn? –

+0

@RutgerKassies câu hỏi hay! Tôi đã bỏ lỡ một chút ... –

+0

Cảm ơn, giải pháp rất thanh lịch. –

3

Giả sử khung dữ liệu của bạn được lưu trữ trong df.

Bạn có thể sử dụng groupby để nhận các hàng không trùng lặp của khung dữ liệu. Ở đây chúng ta phải bỏ qua COLUMN1 đó không phải là một phần của dữ liệu:

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

sau đó bạn có thể hợp nhất dataframe mới này với một bản gốc bằng công merge chức năng:

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

Sau cùng, bạn có thể sử dụng cột _dupindex sáp nhập trong dataframe để làm cho toán học đơn giản để thêm các cột cần thiết:

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'] 
Các vấn đề liên quan