如何在 DataFrame 对象 dtype 中正确识别包含点的浮点值 [0, 1]?

How to correctly identify float values [0, 1] containing a dot, in DataFrame 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

我想要做的只是 select 百分比,在本例中为 0.1744175757 和 1.0000000000 的值,这恰好发生在我的数据中,它们都有一个 period/dot。这是一个关键点——我需要能够区分 1 整数值和 1.0000000000 百分比,以及 0 和 0.0000000000。

我试图寻找点字符的存在,但这不起作用,它 returns 对于每个值都是正确的,我不清楚为什么。

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% 的时间内为我提供我需要的数据,但它 returns 即使没有 '.' 也是如此。字符显然在值中。
  2. 我如何才能正确识别值中包含点字符的所有值 [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