Панды. Проверьте, находятся ли какие-либо разделенные строки из одного столбца в другом

#python #pandas

Вопрос:

У меня есть фрейм данных с 2 столбцами, разделенными запятыми.
Я пытаюсь сделать быстродействующее решение для вычисления 3-d столбца, указывающего, есть ли какие-либо разделенные строки из столбца A , присутствующие в столбце B .
Например:

 df = pd.DataFrame({'A':['apple', 'cucamber', 'tomato,mellon', 'tomato,potato'], 
                   'B':['apple,banana', 'pineapple', 'tomato juice', 'cheese,tomato,onion']})
 

Результат должен быть

   A              B                  C
apple          apple,banana         1
cucamber       pineapple            0
tomato,mellon  tomato juice         0
tomato,potato  cheese,tomato,onion  1
 

Это может быть > 1 млн строк.>
Если это важно для скорости, даже без разделения второго столбца все в порядке, просто выполните поиск разделенных строк из первого столбца за секунду.

   A              B                  C
apple          apple,banana         1
cucamber       pineapple            0
tomato,mellon  tomato juice         1
tomato,potato  cheese,tomato,onion  1
 

Буду признателен за любую помощь.

Ответ №1:

Одна идея с пониманием lsit и any для проверки, соответствует ли по крайней мере одной строке:

 df['C'] = [any(z in y for z in x.split(',')) for x, y in df[['A','B']].to_numpy()]
df['C'] = df['C'].astype(int)
print (df)
               A                    B  C
0          apple         apple,banana  1
1       cucamber            pineapple  0
2  tomato,mellon         tomato juice  1
3  tomato,potato  cheese,tomato,onion  1
 

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

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

 df = pd.DataFrame({'A':[None, 'cucamber', 'tomato,mellon', 'tomato,potato'], 
                   'B':['apple,banana', None, 'tomato juice', 'cheese,tomato,onion']})


d = {'A':'missing1', 'B':'missing'}
df['C'] = [any(z in y for z in x.split(',')) for x, y in df[['A','B']].fillna(d).to_numpy()]
df['C'] = df['C'].astype(int)
print (df)
               A                    B  C
0           None         apple,banana  0
1       cucamber                 None  0
2  tomato,mellon         tomato juice  1
3  tomato,potato  cheese,tomato,onion  1
 

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

1. Спасибо! Не могли бы вы подсказать, как правильно настроить его, чтобы он также не обрабатывался?

2. Это может быть А или В, или и то, и другое.

3. Есть ошибка — теперь, если ее нет в A, она не соответствует Действительности, но должна быть Ложной.

4. @Alex_Y — Я нашел его, поэтому заменил на missing1