Pandas — столбец значений списка (тип str) — поиск совпадений с любым элементом другого списка (также тип str)

#python #pandas #string #list #dataframe

Вопрос:

У меня есть следующие Панды, которые называются pro :

     property    name
0   too         Deliveroo
1   bar         Gousto
2   baz         Gousto
3   foobar      Deliveroo
4   too         Gousto
5   foobaz      Deliveroo
 

При применении следующего кода:

 property = pro.groupby('name')['property'].apply(list).reset_index(name='property')
 

Я получаю собственность df:

     name        property
0   Deliveroo   [too,foobar,foobaz]
1   Gousto      [bar,baz,too]
 

Я хотел бы проверить, совпадают ли элементы из списка с любым из списков в property['property'] столбце, например

check = ['bar'] Следует найти «полосу» в строке 1 df.

check = ['bar','baz'] Следует найти «бар» и «баз» в строке 1 df.

check = ['too'] Следует найти «слишком» в строках 0 и 1 df.

check = ['foobar'] Следует найти «foobar» в строке 0 df.

Я знаю, что могу перебрать все элементы property['property'] (которые относятся к типу списков) и сопоставить их со check списком, но я хотел бы сделать это с помощью эффективного метода Pandas. Я пытался .isin , но в данном случае у меня ничего не получается.

Конечный результат должен позволить использовать check список для фильтрации property df.

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

1. пожалуйста, добавьте свой ожидаемый результат

Ответ №1:

Вы можете использовать set , а затем найти пересечение между значениями фрейма данных и списком:

 >>> prop = pro.groupby('name')['property'].apply(list).reset_index(name='property')
>>> prop['property'].apply(lambda x: set(x).intersection(['bar']))
0       {}
1    {bar}
Name: property, dtype: object

>>> prop['property'].apply(lambda x: set(x).intersection(['bar', 'baz']))
0            {}
1    {baz, bar}
Name: property, dtype: object

>>> prop['property'].apply(lambda x: set(x).intersection(['too']))
0    {too}
1    {too}
Name: property, dtype: object
 

Порядок может не поддерживаться во время использования set , но я не думаю, что это вызывает беспокойство здесь. И будет еще лучше, если вы преобразуете эти значения в set после их группировки, а не в список.

Кстати, не используйте property для имени переменной, это оболочка, которая используется для определения атрибутов свойств класса.

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

1. Привет, я пока не могу проголосовать, но ваше решение послужило хорошей отправной точкой. Кроме того, спасибо за информацию об опасностях использования свойства для имени переменной