Выбор строки фрейма данных с использованием термина в списке, найденном в той же строке фрейма данных - PullRequest
0 голосов
/ 13 июля 2020

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

Name      Terms
Jupiter    [5,planet, big,]
June       [month,6,hot]
Neptune    [blue, planet,big]
Seventeen  [17, number,teen]
Whale      [animal, big, swim]

Я хочу найти термины в 1-м столбце, выполнив поиск / запрос во втором столбце. Так, например, если бы мне пришлось искать термины == 'pl anet', я хочу вернуть либо список, содержащий как Юпитер, так и Нептун, либо часть рамки даты, содержащую две планеты. Как я могу сделать это в Python?

1 Ответ

1 голос
/ 13 июля 2020

Вы можете сделать это с помощью explode:

df.loc[df.explode('Terms').query('Terms == "planet"').index]

Вывод:

      Name                Terms
0  Jupiter     [5, planet, big]
2  Neptune  [blue, planet, big]

Или понимание вложенного списка

df.loc[[any(n == 'planet' for n in i) for i in df['Terms']]]

Вывод:

      Name                Terms
0  Jupiter     [5, planet, big]
2  Neptune  [blue, planet, big]

Время:

%timeit df.loc[df.explode('Terms').query('Terms == "planet"').index]
7.07 ms ± 95 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit df[df['Terms'].apply(lambda x : True if "Planet" in x else False)]
861 µs ± 43 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df.loc[[any(n == 'planet' for n in i) for i in df['Terms']]]
674 µs ± 33.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...