Как правильно определить значения с плавающей точкой [0, 1], содержащие точку, в объекте DataFrame dtype? - PullRequest
1 голос
/ 09 апреля 2019

У меня есть такой фрейм данных, где мои значения имеют тип объекта dtype:

df = pd.DataFrame(data=['A', '290', '0.1744175757', '1', '1.0000000000'], columns=['Value'])

df
Out[65]: 
          Value
0             A
1           290
2  0.1744175757
3             1
4  1.0000000000

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 1 columns):
Value    5 non-null object
dtypes: object(1)
memory usage: 120.0+ bytes

Что я хочу сделать, это выбрать только проценты, в этом случае значения 0,1744175757 и 1,0000000000, что так и происходит ввсе мои данные будут иметь точку / точку в них.Это ключевой момент - мне нужно уметь различать целое значение от 1 до 1,0000000000 в процентах, а также от 0 до 0,0000000000.

Я пытался найти наличие точкисимвол, но это не работает, оно возвращает true для каждого значения, и мне неясно, почему.

df[df['Value'].str.contains('.')]
Out[67]: 
          Value
0             A
1           290
2  0.1744175757
3             1
4  1.0000000000

Я также пробовал isdecimal (), но это не совсем то, что я хочу:

df[df['Value'].str.isdecimal()]
Out[68]: 
  Value
1   290
3     1

Наиболее близкая мне функция:

def isPercent(x):

    if pd.isnull(x):
        return False

    try:
        x = float(x)
        return x % 1 != 0
    except:
        return False

df[df['Value'].apply(isPercent)]
Out[74]: 
          Value
2  0.1744175757

, но это не позволяет правильно определить сценарии 1.0000000000 (и 0.0000000000).

У меня два вопроса:

  1. Почему str.contains ('.') Не работает в этом контексте?Похоже, это самый простой способ, поскольку в 100% случаев он дает мне то, что мне нужно в моих данных, но возвращает True, даже если нет '.'символ четко указан в значении.
  2. Как правильно определить все значения [0, 1], для которых в значении указан символ точки?

1 Ответ

3 голосов
/ 09 апреля 2019

str.contains выполняет поиск по регулярному выражению по умолчанию и '.' будет соответствовать любому символу с помощью двигателя регулярных выражений. Чтобы отключить его, используйте regex=False:

df[df['Value'].str.contains('.', regex=False)]

          Value
2  0.1744175757
4  1.0000000000

Вы также можете избежать этого, чтобы трактовать это буквально:

df[df['Value'].str.contains(r'\.')]

          Value
2  0.1744175757
4  1.0000000000

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

df[df['Value'].str.contains(r'\d+\.\d+')].astype(float)

      Value
2  0.174418
4  1.000000
...