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