У меня есть 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
James Scott 29 Апр 2020 в 18:09

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
1
ALollz 29 Апр 2020 в 18:35
Подождите, возможно, я не понимаю вопроса, я думаю, что в этом случае все равно будет [True, False, True], потому что маска основана на том, находится ли значение в A где-либо в B или C, и 2 все еще не находится в этих 6 значениях
 – 
ALollz
29 Апр 2020 в 18:31
Это правильно. Я смотрю, находится ли это значение где-нибудь в двух столбцах. так что будет поиск 6 полных значений. мне пришлось изменить вопрос, потому что мои данные в текстовом формате, а не в числах. Извини за это.
 – 
James Scott
29 Апр 2020 в 18:34
Благодарность! ваш код все еще работает, мне действительно интересно, почему я не могу использовать простой метод .isin() для нескольких столбцов
 – 
James Scott
29 Апр 2020 в 18:51
Если это все еще медленно, вы можете попробовать использовать .isin(np.unique(df2.to_numpy().ravel())). Если у вас много повторяющихся значений, это может ускорить процесс.
 – 
ALollz
29 Апр 2020 в 19:00
Когда вы используете DataFrame как values для .isin, требуется выравнивание как по индексу, так и по столбцам. Вам действительно не нужно такое выравнивание, поэтому вы не можете использовать DataFrame. Вам просто нужен массив, чтобы он проверял значение в любом месте в DataFrame, а не только в строке или строке и столбце при использовании Series или DataFrame соответственно в качестве значений.
 – 
ALollz
29 Апр 2020 в 19:02