【问题标题】:Extracting Floating Values from A String In A Dataframe从数据框中的字符串中提取浮点值
【发布时间】:2022-01-17 00:22:16
【问题描述】:

我有以下数据框,df:

name         result

AAA           4.5
BBB           UNK
CCC      less than 2.45
DDD     Men > 40: 2.5-3.5

result 列的dtypesdtype('O')

我需要提取浮点值并使用特定阈值对其进行过滤。

我尝试了以下脚本来提取值并将它们更改为浮点数:

df['result'] = df['result'].str.extract(r'(\d+.\d+)').astype('float')

但是,我不确定我是否得到了正确的输出,尤其是当值的范围为2.5-3.5 时。在这种情况下,我想要最大值,i.e. 3.5

期望的输出:

name         result

AAA           4.5
CCC           2.45
DDD           3.5

最聪明的做法是什么?任何建议,将不胜感激。谢谢!

【问题讨论】:

    标签: python pandas string dataframe data-manipulation


    【解决方案1】:

    您可以使用extractall 提取所有出现的浮点数,然后使用max 仅取最大值。

    >>> ext = (df.result.str.extractall(r'(\d+.\d+)')
           .astype(float)
           .unstack()
           .max(axis=1))
    
    >>> ext
    0    4.50
    2    2.45
    3    3.50
    

    接下来,您可以将其加入原始数据框。 ext 当前是一个系列,因此在加入之前将其转换为数据框to_frame。如果您想删除 NaN,请使用 inner 加入,如果您想保留它,请使用 left(默认)。

    >>> df = df[['name']].join(ext.to_frame('result'), how='inner')
    >>> df
      name  result
    0  AAA    4.50
    2  CCC    2.45
    3  DDD    3.50
    

    【讨论】:

    • 感谢@emma 的帮助,提供了很好的解释。欣赏!
    • 嗨@emma,如果我想完全删除那些具有范围值的行,即DDD 行,我应该如何处理?
    • 逻辑是“如果包含“-”?还是应该更健壮的逻辑?如果是前者,你可以df[~df.result.str.contains('-')]。如果需要匹配正则表达式,请检查 DataFrame.filter 函数。
    猜你喜欢
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2010-10-30
    • 1970-01-01
    • 2022-09-23
    • 2017-06-09
    相关资源
    最近更新 更多