Фильтровать дублирующиеся строки на основе выбранных столбцов и сравнивать с другим фреймом данных в Pandas

#python #python-3.x #pandas #dataframe

#питон #python-3.x #панды #фрейм данных

Вопрос:

Даны два фрейма данных следующим образом:

 import pandas as pd 

# Creating a DataFrame object   
df1 = pd.DataFrame([('Stuti', 28, 'Varanasi'), 
            ('Saumya', 32, 'Delhi'), 
            ('Aaditya', 25, 'Mumbai'), 
            ('Saumya', 32, 'Delhi')],  
                   columns = ['Name', 'Score', 'City']) 

df2 = pd.DataFrame([('Saumya', 32, 'Delhi'), 
            ('Saumya', 32, 'Mumbai'), 
            ('Aaditya', 40, 'Mumbai'), 
            ('Seema', 32, 'Delhi')],  
                   columns = ['Name', 'Score', 'City'])
 

Как я мог бы создать маску для df2 фильтрации дублирующихся строк на основе df1 столбцов Name и City и, если в них существовала одна и та же пара df1 , затем вернуть check столбец с Duplicated , в противном случае, return None .

Ожидаемый результат будет выглядеть:

     Name  Score      City       Check
0   Saumya     32     Delhi  Duplicated
1   Saumya     32    Mumbai        None
2  Aaditya     40  Dehradun  Duplicated
3    Seema     32     Delhi        None
 

Обновленный код:

 df = pd.concat([df1, df2])

df[df.duplicated(['Name', 'City'])] 
 

Вон:

       Name  Score    City
3   Saumya     32   Delhi
0   Saumya     32   Delhi
2  Aaditya     40  Mumbai
 

Ответ №1:

 In [65]: df2.merge(df1[['Name', 'City']].drop_duplicates(), how='left', indicator='Check').assign(Check=lambda x: np.where(x['Check'] == 'both', 'Duplicated', None))
Out[65]:
      Name  Score    City       Check
0   Saumya     32   Delhi  Duplicated
1   Saumya     32  Mumbai        None
2  Aaditya     40  Mumbai  Duplicated
3    Seema     32   Delhi        None
 

Ответ №2:

Вы можете сравнить оба столбца, преобразованные в Multiindex форму, сравнить по парам:

 m = df2.set_index(['Name','City']).index.isin(df1.set_index(['Name','City']).index)
df2['Check'] = np.where(m, 'Duplicated', None)
print (df2)
      Name  Score    City       Check
0   Saumya     32   Delhi  Duplicated
1   Saumya     32  Mumbai        None
2  Aaditya     40  Mumbai  Duplicated
3    Seema     32   Delhi        None