У меня есть следующий Pandas DataFrame:
>>> sample_dataframe
P
0 107.35
1 99.35
2 75.85
3 92.34
Когда я пытаюсь сделать следующее, вывод будет следующим:
>>> sample_dataframe[sample_dataframe['P'].astype(str).str.count('.') == 1]
Empty DataFrame
Columns: [P]
Index: []
При использовании экранированного символа регулярного выражения происходит следующее:
>>> sample_dataframe[sample_dataframe['P'].astype(str).str.count('\.') == 1]
P
0 107.35
1 99.35
2 75.85
3 92.34
Это подтверждает следующее:
>>> sample_dataframe['P'].astype(str).str.count('.')
0 6
1 5
2 5
3 5
Name: P, dtype: int64
против.
sample_dataframe['P'].astype(str).str.count('\.')
0 1
1 1
2 1
3 1
Name: P, dtype: int64
Таким образом, выражение .
фактически учитывает все символы как подстановочный знак регулярного выражения, минус символы новой строки, отсюда 6, 5, 5, 5 по сравнению с экранированным \.
, чтоподсчитывает только вхождение фактического символа .
.
Однако обычная функция, вызываемая из самой строки, кажется, действует по-другому и не нуждается в экранировании регулярного выражения '.':
>>> '105.35'.count('.')
1
>>> '105.35'.count('\.')
0
РЕДАКТИРОВАТЬ: Основываясь на некоторых ответах, я попытаюсь уточнить вызовы функций класса ниже (тогда как прямо выше - вызов метода экземпляра объекта):
>>> str.count('105.35', '.')
1
>>> str.count('105.35', '\.')
0
Я не уверенесли связанные с Pandas методы, использующие CPython под капотом (из-за операций NumPy), реализуют это как Regex (в том числе для df.apply), или если это связано с различием в str
функции класса count
(т.е. str.count()
) и метод класса str
экземпляра объекта (в приведенном выше примере '105.35'
) count
(то есть '105.35'.count()
). Является ли различие между классом и объектной функцией / методом основной причиной (и как они реализованы), или это вызвано тем, как DataFrames реализуются через NumPy?
Я действительно хотел бы получить дополнительную информацию об этом, чтобыдействительно понимаю, как это работает