Если у меня есть два кадра данных, один из которых является подмножеством другого, как мне полностью удалить общие строки? - PullRequest
0 голосов
/ 16 мая 2019

Я уже искал этот тип вопроса, но никто из них не отвечает на мой вопрос.

Предположим, у меня есть два кадра данных, и их индексы НЕ соответствуют. df2 - это подмножество df1, и я хочу удалить все строки в df1, которые присутствуют в df2.

Я уже попробовал следующее, но это не дает мне результат, который я ищу.

df1[~df1.index.isin(df2.index)]

К сожалению, я не могу поделиться с вами исходными данными, однако количество столбцов в этих двух кадрах равно 14.

Вот пример того, что я ищу:

df1 = 

   month  year  sale
0      1  2012    55
1      4  2014    40
2      7  2013    84
3     10  2014    31
df2 = 
   month  year  sale
0      1  2012    55
1     10  2014    31

и я ищу:

df = 

   month  year  sale
0      4  2014    40
1      7  2013    84

Ответы [ 4 ]

1 голос
/ 16 мая 2019

Вы можете создать мультииндекс со всеми столбцами в каждом кадре данных.С этого момента вам нужно просто отбросить индексы второго из первого:

df1.set_index(list(df1.columns)).drop(df2.set_index(list(df2.columns)).index).reset_index()

Результат с данными вашего примера:

   month  year  sale
0      4  2014    40
1      7  2013    84
1 голос
/ 16 мая 2019

Итак, вы хотите удалить по значениям, а не по индексу.

Используйте сцепление и отбросьте:

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

Пример:

df1 = pd.DataFrame({'month': [1, 4, 7, 10], 'year': [2012, 2014, 2013, 2014], 'sale': [55, 40, 84, 31]})
df2 = pd.DataFrame({'month': [1, 10], 'year': [2012, 2014], 'sale': [55, 31]})
pd.concat([df1, df2]).drop_duplicates(keep=False)

Результат:

   month  sale  year
1      4    40  2014
2      7    84  2013
1 голос
/ 16 мая 2019

можете попробовать ниже:

df1[~df1.isin(df2)]
1 голос
/ 16 мая 2019

Используйте левое соединение по параметру DataFrame.merge и indicator, затем сравните новый столбец для Series.eq (==) и отфильтруйте по boolean indexing :

df = df1[df1.merge(df2, indicator=True, how='left')['_merge'].eq('left_only')]
print (df)
   month  year  sale
1      4  2014    40
2      7  2013    84
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...