#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