Проверьте, существует ли строка в фрейме данных в другом фрейме данных, и удалите их из обоих

#python #pandas #dataframe

Вопрос:

Я пытаюсь проверить, существуют ли строки в одном фрейме данных в другом, и если да, то я хочу удалить их из обоих фреймов данных. До сих пор все примеры, которые я вижу, используют pd.merge, но это сливается в один фрейм данных. Моя цель состоит в том, чтобы сохранить два отдельных кадра данных и просто удалить общие строки.

Пример выглядит следующим образом:

 df1:
                id            name             class        Grade
0             2547            John             Math         119.01
1             2547            Joe              Science      0.00
2             2547            Steve            History      0.47
3             2547            Hari             PE           5.70

df2:
                id            name             class        Grade
0             2547            John             Math         119.01
1             2547            Joe              Science      2
2             2547            Steve            History      22
3             2547            Hari             PE           5.71

expected output:

    df1:
                    id            name             class        Grade
    0             2547            Joe              Science      0.00
    1             2547            Steve            History      0.47
    2             2547            Hari             PE           5.70
    
    df2:
                    id            name             class        Grade
    0             2547            Joe              Science      2
    1             2547            Steve            History      22
    2             2547            Hari             PE           5.71
 

до сих пор я пытался сделать следующее, но это бесполезно, потому что это объединяет два кадра данных:

 df = pd.merge(df1, df2, on=['Grade'], how='outer')
 

Ответ №1:

Вы можете сохранить общие строки с inner помощью слияния, добавить их к обоим кадрам данных и удалить дубликаты, не сохраняя ни одного из дубликатов, drop_duplicates(keep=False) :

 t = df1.merge(df2,'inner')
df2, df1 = df2.append(t).drop_duplicates(keep=False) , df1.append(t).drop_duplicates(keep=False)
 

С принтами:

 >>> df1
 
     id   name    class  Grade
1  2547    Joe  Science   0.00
2  2547  Steve  History   0.47
3  2547   Hari       PE   5.70

>>> df2

     id   name    class  Grade
1  2547    Joe  Science   2.00
2  2547  Steve  History  22.00
3  2547   Hari       PE   5.71

>>> t
 
     id  name class   Grade
0  2547  John  Math  119.01
 

Ответ №2:

Создайте MultiIndex объекты с помощью from_frame метода, затем проверьте принадлежность, используя MultiIndex.isin для создания логических масок, чтобы отфильтровать строки

 i1 = pd.MultiIndex.from_frame(df1)
i2 = pd.MultiIndex.from_frame(df2)

df1, df2 = df1[~i1.isin(i2)], df2[~i2.isin(i1)]
 

 >>> df1
     id   name    class  Grade
1  2547    Joe  Science   0.00
2  2547  Steve  History   0.47
3  2547   Hari       PE   5.70

>>> df2
     id   name    class  Grade
1  2547    Joe  Science   2.00
2  2547  Steve  History  22.00
3  2547   Hari       PE   5.71
 

Ответ №3:

    Try this -



 dataframe1 = pd.DataFrame(data={"column1": [1, 2, 3, 4, 5]})
    
    dataframe2 = pd.DataFrame(data={"column1": [1, 2]})
    
    
    common = dataframe1.merge(dataframe2, on=["column1"])
    
    result = dataframe1[~dataframe1.column1.isin(common.column1)]
    
    
    print(result)
 

Обратитесь к этой статье для получения более подробной информации-
https://www.kite.com/python/answers/how-to-get-rows-from-a-dataframe-that-are-not-in-another-dataframe-in-python

или вы могли бы это просто проверить-

 df = df1.merge(df2, on='grade', suffixes=(' from df1',' from df2'))
df.insert(0, 'id', df['grade']   '-'   df.pop('grade'))
print (df)
 

Комментарии:

1. Спасибо, что поделились! Это не помогает, потому что я получаю результирующий кадр данных, в то время как моя цель-просто удалить общие строки из dataframe1 и dataframe2.. если в этом есть смысл

Ответ №4:

Вот простой подход, использующий isin и all :

 df3 = df1[~df1.isin(df2).all(axis=1)]
df4 = df2[~df2.isin(df1).all(axis=1)]
df1 = df3
df2 = df4
 

Или просто,

 df1, df2 = df1[~df1.isin(df2).all(axis=1)], df2[~df2.isin(df1).all(axis=1)]