Странное поведение при подсчете числа строк с помощью Pandas DataFrame - PullRequest
1 голос
/ 11 ноября 2019

У меня есть следующий 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?

Я действительно хотел бы получить дополнительную информацию об этом, чтобыдействительно понимаю, как это работает

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Это связано с тем, что методы Pandas.Series.str.count и количество строк различаются. Здесь вы можете увидеть (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.count.html#pandas.Series.str.count), что Pandas.Series.str.count принимает регулярное выражение в качестве аргумента. И «.» Регулярное выражение означает «любой символ», тогда как str.count получает количество предоставленных подстрок (не регулярное выражение)

0 голосов
/ 11 ноября 2019

Если флажок Series.str.count по умолчанию работает с шаблоном регулярных выражений, поэтому необходимо экранировать \. для счетчика ., в противном случае он считает все значения регулярным выражением . '.

Если хотите проверить, как реализована функция в пандах, проверьте this .


str.count в чистом Python, работающем по-другому, не с регулярным выражением, а с подстрокой,поэтому вывод отличается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...