Поиск подстроки в pandas frozenset

#python #pandas #substring #frozenset

#python #pandas #подстрока #frozenset

Вопрос:

Я пытаюсь найти подстроку в frozenset, однако у меня немного не хватает вариантов.

Моей структурой данных является pandas.dataframe (она взята из association_rules пакета mlxtend , если вы знакомы с ним), и я хочу напечатать все строки, где предшествующие элементы (которые являются frozenset) включают определенную строку.

Пример данных: введите описание изображения здесь

     print(rules[rules["antecedents"].str.contains('line', regex=False)])
  

Однако всякий раз, когда я запускаю его, я получаю пустой фрейм данных.

Когда я пытаюсь запустить только внутреннюю функцию в моей серии rules["antecedents"] , я получаю только ложные значения для всех записей. Но почему это?

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

1. Вы пробовали rules[rules["antecedents"].str.contains('line', regex=False) == True] ?

2. Потому что rules["antecedents"] это не строка, а frozenset. Следовательно rules["antecedents"].str , это неправильная попытка получить строковое представление frozenset, которое, как говорит @adrtam, выдает только NaN (возможно, это должно вызвать исключение). Поскольку вы не предоставили MCVE, не могли бы вы, пожалуйста, вывести фактическое значение rules["antecedents"] ?

3. @ElBaulP да, я нашел этот ответ в другом сообщении stackoverflow, извините, что не упомянул. Мне кажется, что это делает то же самое. @smci Фактический тип rules["antecedents"] является pandas.core.series.Series . Что означает MCVE? Я не смог найти приемлемый результат в Google. И спасибо, что приукрасил мой вопрос.

Ответ №1:

Потому что dataframe.str.* функции предназначены только для строковых данных. Поскольку ваши данные не являются строковыми, они всегда будут NaN, независимо от их строкового представления. Чтобы доказать:

 >>> x = pd.DataFrame(np.random.randn(2, 5)).astype("object")
>>> x
         0         1         2          3          4
0 -1.17191  -1.92926 -0.831576 -0.0814279   0.099612
1 -1.55183 -0.494855   1.14398   -1.72675 -0.0390948
>>> x[0].str.contains("-1")
0   NaN
1   NaN
Name: 0, dtype: float64
  

Что вы можете сделать:

Использовать apply :

 >>> x[0].apply(lambda x: "-1" in str(x))
0    True
1    True
Name: 0, dtype: bool
  

Итак, ваш код должен писать:

 print(rules[rules["antecedents"].apply(lambda x: 'line' in str(x))])
  

Возможно, вам захочется использовать 'line' in x , если вы имеете в виду точное совпадение по элементу

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

1. Спасибо вам за это! Сегодня я наткнулся на похожее решение, но, похоже, я что-то не так понял. Этот вид применения лямбда-функций к фреймам данных выглядит очень мощным, возможно, мне следует изучить это немного подробнее.