Используйте dataframe.запрос для выбора значений из списка, содержащегося в pd.DataFrame

#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