#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