Python Pandas-найти разницу между двумя кадрами данных

У меня есть два фрейма данных df1 и df2, где df2 является подмножеством df1. Как мне получить новый фрейм данных (df3), который является разницей между двумя фреймами данных?

другими словами, фрейм данных, который имеет все строки / столбцы в df1, которые не находятся в df2?

enter image description here

3 ответов


С помощью drop_duplicates

pd.concat([df1,df2]).drop_duplicates(keep=False)

для строк, попробуйте этот, с cols набор в список столбцов, которые вы хотите сравнить:

m = df1.merge(df2, on=cols, how='outer', suffixes=['', '_'], indicator=True)

для столбцов, попробуйте это:

set(df1.columns).symmetric_difference(df2.columns)

import pandas as pd
# given
df1 = pd.DataFrame({'Name':['John','Mike','Smith','Wale','Marry','Tom','Menda','Bolt','Yuswa',],
    'Age':[23,45,12,34,27,44,28,39,40]})
df2 = pd.DataFrame({'Name':['John','Smith','Wale','Tom','Menda','Yuswa',],
    'Age':[23,12,34,44,28,40]})

# find elements in df1 that are not in df2
df_1notin2 = df1[~(df1['Name'].isin(df2['Name']) & df1['Age'].isin(df2['Age']))].reset_index(drop=True)

# output:
print('df1\n', df1)
print('df2\n', df2)
print('df_1notin2\n', df_1notin2)

# df1
#     Age   Name
# 0   23   John
# 1   45   Mike
# 2   12  Smith
# 3   34   Wale
# 4   27  Marry
# 5   44    Tom
# 6   28  Menda
# 7   39   Bolt
# 8   40  Yuswa
# df2
#     Age   Name
# 0   23   John
# 1   12  Smith
# 2   34   Wale
# 3   44    Tom
# 4   28  Menda
# 5   40  Yuswa
# df_1notin2
#     Age   Name
# 0   45   Mike
# 1   27  Marry
# 2   39   Bolt