Панды — проверьте совпадения строк в разных столбцах со значениями столбцов, разделенными запятыми

#pandas #dataframe

#панды #фрейм данных

Вопрос:

Привет, у меня есть df, как показано ниже:

 Col1 Col2  SM_ SM_ SM_ N_ EX_,SM_ EX_,CO_ SL_,N_ PD_,SL_  

Я хочу сравнить оба столбца и посмотреть, присутствует ли значение в Col1 в Col2 или нет. Несколько значений в обоих столбцах разделены запятыми. Таким образом, в идеале результат сравнения строк, показанного выше, должен быть:

 True False True True  

Прямо сейчас у меня есть следующий код:

 finaldf['C'] = finaldf.apply(lambda x: x.Extracted_pillars in x.min_pillar_score, axis=1)  

Это работает для значений одного кода, но когда каждый столбец содержит несколько значений, это работает неправильно.

Комментарии:

1. Я удалил свой ответ, потому что, похоже, в вашем фрейме данных больше возможных случаев. Вы можете добавить больше строк в свой образец, чтобы было понятно, что там может появиться. Мы не можем предсказать все.

2. Я добавил больше строк, пожалуйста, помогите?! Спасибо

3. Когда я проверяю его с помощью решения, которое я предоставил ранее, я получаю те же результаты, что и ожидалось: Истина, Ложь, Истина, Истина. Порядок элементов в каждой строке ничего не меняет.

4. это решение дает ЛОЖЬ , если Col1==EX_, MA_ и Col2==EX_

5. Вы имеете в виду, когда перед или после запятой есть пробел?

Ответ №1:

Вы можете использовать функцию, которая для каждой ячейки создает набор значений, разделенных запятыми, и возвращает, не является ли пересечение этих наборов в строке пустым:

 import pandas as pd  def columns_overlap(row):  sets = [set(s.split(',')) for s in row]  intersection = set.intersection(*sets)  return intersection != set()  df = pd.DataFrame({'Col1': ['SM_', 'SM_', 'EX_,SM_', 'SL_,N_'],  'Col2': ['SM_', 'N_', 'EX_,CO_', 'PD_,SL_']})  df['C'] = df.apply(columns_overlap, axis=1)  

Это приводит к следующему кадру данных:

 Col1 Col2 C 0 SM_ SM_ True 1 SM_ N_ False 2 EX_,SM_ EX_,CO_ True 3 SL_,N_ PD_,SL_ True  

Комментарии:

1. большое спасибо! это блестяще, я уже принял другой ответ раньше, хотя 🙂

Ответ №2:

Ваше решение хорошее, но вам нужно разделить каждую строку запятой и использовать any .

Редактировать:

Оказывается, бывают случаи, когда перед или после запятой стоит пробел. Тогда вы можете использовать:

 finaldf['C'] = finaldf.apply(lambda x: any(i in x.Col1.replace(' ', '').split(',')  for i in x.Col2.replace(' ', '').split(',')),  axis=1)  

Выход:

 0 True 1 False 2 True 3 True  

Комментарии:

1. Это возвращает значение false , если Col1==SM_, N_ и Col2==N_,SM_

2. это также возвращает false , если Col1==EX_,SM_ и Col2==EX_, MA_

3. Пожалуйста, посмотрите отредактированный ответ. Это работает в тех случаях, когда есть дополнительное пространство.