Python 如何在DataFrame对象数据类型中正确识别包含点的浮点值[0,1]?

Python 如何在DataFrame对象数据类型中正确识别包含点的浮点值[0,1]?,python,string,pandas,floating-point,contains,Python,String,Pandas,Floating Point,Contains,我有一个这样的数据框,其中我的值是object 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() <c

我有一个这样的数据框,其中我的值是object 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
我也尝试了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)的场景

我有两个问题:

  • 为什么str.contains('.')在此上下文中不起作用?这似乎是最简单的方法,因为它将在100%的时间内获得我需要的数据,但即使值中没有“.”字符,它也会返回True
  • 如何正确识别值中包含点字符的所有值[0,1]

  • 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
    

    对不起,我对着枕头大喊大叫(但谢谢你)。
    df[df['Value'].str.contains(r'\d+\.\d+')].astype(float)
    
          Value
    2  0.174418
    4  1.000000