#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