#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.. если в этом есть смысл