#python #python-3.x #pandas #dataframe
#python #python-3.x #панды #dataframe
Вопрос:
Я хотел бы извлечь / отфильтровать строки фрейма данных, который содержит строки из списка, в этом случае я пытаюсь использовать запросы, поскольку они обычно отлично подходят для этой работы и очень изящны в коде, я пробовал:
my_list = ['red', 'blue', 'green', 'yellow']
df_new = df.query("`User Color` in @my_list")
Я ищу функцию, которая работает как in
(если строка содержится)
Мой dataframe df выглядит примерно так:
name id User Color Age
Luis 876 blue, green 35
Charles 12 blue, brown 34
Luna 654 black 24
Anna 987 brown 19
Silvana 31 red, black 26
Juliet 55 red 20
И результат, который я ожидаю, должен быть:
name id User Color Age
Luis 876 blue, green 35
Charles 12 blue, brown 34
Silvana 31 red, black 26
Juliet 55 red 20
Комментарии:
1.
df_subset = df[df['User Color'].map(lambda val: any(x in my_list for x in val.split(',')))]
это должно сработать2.^^^
val.split(',')
: )3. Спасибо @DavidErickson за указание на это.
Ответ №1:
Вам нужно разделить значения в каждой строке и проверить, присутствуют ли какие-либо из этих значений в выбранном списке.
Это можно сделать с помощью функции map
df_subset = df[df['User Color'].map(lambda val: any(x in my_list for x in val.split(',')))]
Поскольку это совпадение строк, поэтому в зависимости от ваших требований рассмотрите чередование и уменьшение разделенных значений.
Код, аналогичный приведенному выше, но описательный:
def filter_color(val):
for x in val.split(','):
if x.lower().strip() in my_list:
return True
return False
df_subset = df[df['name'].map(filter_color)]
Комментарии:
1. Большое вам спасибо! Это также замечательный ответ, даже если он не использует метод запроса. Я тоже пробовал, и это работает. Я действительно ценю это
Ответ №2:
Построение решения @DavidErickson с использованием query
метода::
df.query("`User Color`.str.contains('|'.join(@my_list))")
name id User Color Age
0 Luis 876 blue, green 35
1 Charles 12 blue, brown 34
4 Silvana 31 red, black 26
5 Juliet 55 red 20
Ответ №3:
Вместо разделения столбца dataframe вы можете сделать обратное, то есть присоединиться к списку. Вы могли бы использовать join
with str.contains
. ПРИМЕЧАНИЕ: это не так надежно, поскольку не дает прямого совпадения:
df[df['User Color'].str.contains('|'.join(my_list))]
Out[1]:
name id User Color Age
0 Luis 876 blue, green 35
1 Charles 12 blue, brown 34
4 Silvana 31 red, black 26
5 Juliet 55 red 20