Удаление столбцов из фрейма данных с помощью хеширования

#python #pandas #indexing #merge #multiple-columns

#python #pandas #индексирование #слияние #несколько столбцов

Вопрос:

Даны два фрейма данных pandas:

 df1 = pd.read_csv(file1, names=['col1','col2','col3'])
df2 = pd.read_csv(file2, names=['col1','col2','col3'])
  

Я хотел бы удалить все строки в df2, где значения либо col1 или col2 (или обоих) не существуют в df1.

Выполните следующие действия:

 df2 = df2[(df2['col1'] in set(df1['col1'])) amp; (df2['col2'] in set(df1['col2']))]
  

дает:

Ошибка типа: объекты ‘Series’ изменяемы, поэтому их нельзя хэшировать

Ответ №1:

Я думаю, вы можете попробовать isin :

 df2 = df2[(df2['col1'].isin(df1['col1'])) amp; (df2['col2'].isin(df1['col2']))]

df1 = pd.DataFrame({'col1':[1,2,3,3],
                    'col2':[4,5,6,2],
                    'col3':[7,8,9,5]})

print (df1)
   col1  col2  col3
0     1     4     7
1     2     5     8
2     3     6     9
3     3     2     5

df2 = pd.DataFrame({'col1':[1,2,3,5],
                    'col2':[4,7,4,1],
                    'col3':[7,8,9,1]})

print (df2)
   col1  col2  col3
0     1     4     7
1     2     7     8
2     3     4     9
3     5     1     1

df2 = df2[(df2['col1'].isin(df1['col1'])) amp; (df2['col2'].isin(df1['col2'].unique()))]
print (df2)
   col1  col2  col3
0     1     4     7
2     3     4     9
  

Другое решение заключается merge в том, что по умолчанию используется функция inner join ( how='inner' ), но она работает только для значений с одинаковой позицией в обоих DataFrames :

 print (pd.merge(df1, df2))
   col1  col2  col3
0     1     4     7