#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. Пожалуйста, посмотрите отредактированный ответ. Это работает в тех случаях, когда есть дополнительное пространство.