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

Posted

技术标签:

【中文标题】如何在 DataFrame 对象 dtype 中正确识别包含点的浮点值 [0, 1]?【英文标题】:How to correctly identify float values [0, 1] containing a dot, in DataFrame object dtype? 【发布时间】:2019-08-30 03:21:00 【问题描述】:

我有一个像这样的数据框,其中我的值是对象 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)的场景。

我有两个问题:

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

【问题讨论】:

【参考方案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

【讨论】:

对不起,我对着枕头大喊大叫(但谢谢)。

以上是关于如何在 DataFrame 对象 dtype 中正确识别包含点的浮点值 [0, 1]?的主要内容,如果未能解决你的问题,请参考以下文章

如何在核心数据中正确保存可转换对象?

如何仅聚合混合 dtypes 数据框中的数字列

DataFrame的分配无法正常工作,但dtypes已更改

pandas中DataFrame

基于原始列的 dtype 是对象,在数据框中创建多个虚拟变量的最佳方法是啥?

pandas使用select_dtypes函数筛选dataframe中的所有数值数据列(all numeric columns of a dataframe)