У меня есть 2 фрейма данных ниже. Моя цель - проверить, находятся ли значения столбца df['A'] в нескольких столбцах второго фрейма данных df2['B'] или df2['C'] и вернуть true или false, если значение присутствует. Столбец test — это мой выходной столбец.
df
A test
q True
w False
e True
df2
B C
q r
g r
g e
Мой текущий код ниже работает, однако он очень медленно работает с сотнями и тысячами строк. Я использую метод list
в этом случае ниже, чтобы преобразовать 2 столбца df2 в список и проверить, есть ли строки в этом списке. Однако мне нужно что-то намного быстрее, чем это.
listb = df2['B'].to_list()
listc = df2['C'].to_list()
df['test'] = df['A'].apply(lambda x: 'True' if x in (listb or listc) else 'False')
Я пытался использовать метод .isin()
, но не могу заставить его работать с несколькими столбцами для поиска нескольких столбцов в отдельных наборах данных. Однако эти коды запускаются и возвращают все False, что неверно.
df['test'] = df['A'].isin(df2[['B','C']]).any(axis = 1)
1 ответ
Вы можете использовать isin
после того, как распутаете другой DataFrame. Или np.in1D
. Назначьте результат обратно df['test']
.
np.in1d(df1['A'], df2)
#array([ True, False, True])
df['A'].isin(df2.to_numpy().ravel())
#0 True
#1 False
#2 True
#Name: A, dtype: bool
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.
[True, False, True]
, потому что маска основана на том, находится ли значение в A где-либо в B или C, и2
все еще не находится в этих 6 значениях.isin(np.unique(df2.to_numpy().ravel()))
. Если у вас много повторяющихся значений, это может ускорить процесс.values
для.isin
, требуется выравнивание как по индексу, так и по столбцам. Вам действительно не нужно такое выравнивание, поэтому вы не можете использовать DataFrame. Вам просто нужен массив, чтобы он проверял значение в любом месте в DataFrame, а не только в строке или строке и столбце при использовании Series или DataFrame соответственно в качестве значений.