从熊猫字符串中提取带有小数的数字

时间:2020-10-05 20:42:17

标签: python pandas

我的熊猫数据框中的一列同时包含数字和字符串值。我尝试了几个答案,但对于已经只包含数字值的单元格却获得了NaN值。

示例

Column1
Oh great, 10,7
Awesome, 20.3
1.5
Vaaw, 9/10
100

代码:

df['Column1'] = df['Column1'].str.extract('([0-9][,.]*[0-9]*)')
例如,对于第三和第四行,我得到了Nan。我将第四行保持在9/10就可以了

4 个答案:

答案 0 :(得分:3)

你很近。

df['Column1'] = df['Column1'].str.extract('([0-9]+[,./]*[0-9]*)')
#df
  Column1
0    10,7
1    20.3
2     1.5
3    9/10

另一个可能的正则表达式如下。在此示例中,它将产生相同的结果,但更具“一般性”。它表示查找数字,后跟(可能)后跟空格以外的任何内容,再跟(可能)后跟更多数字。如果返回"hello 10f7",则对于10f7这样的字符串将失败。因此,这取决于您对数据质量的了解。

df['Column1'] = df['Column1'].str.extract('(\d+\W*\d*)')

答案 1 :(得分:3)

让我们尝试一下:

df['Value'] = df['Column1'].str.extract('([\d/,\.]+)$')[0]

或更简单:

df['Value'] = df['Column1'].str.extract('(\S+)$')[0]

输出:

          Column1 Value
0  Oh great, 10,7  10,7
1   Awesome, 20.3  20.3
2             1.5   1.5
3      Vaaw, 9/10  9/10

答案 2 :(得分:2)

用户正则表达式digit\special charcter(.)\digit

df['num']=df.Column1.str.extract('(\d+\.\d+)')

          Column1   num
0  Oh great, 10,7   NaN
1   Awesome, 20.3  20.3
2             1.5   1.5
3      Vaaw, 9/10   NaN

答案 3 :(得分:2)

如果您的Column1是object类型的(即,它既包含字符串又包含数字),那么您将必须首先将其强制为字符串类型并使用extract

df = pd.DataFrame({'Column1': [
                               'Oh great, 10,7', 
                               'Awesome, 20.3', 
                               '1.5', 
                               1.5, 
                               'Vaaw, 9/10']})

print (df['Column1'].astype(str).str.extract('([0-9]+[,./]*[0-9]*)'))

输出:

      0
0  10,7
1  20.3
2   1.5
3   1.5
4  9/10

但是,如果您的Column1仅包含字符串,则只需更正正则表达式:

df = pd.DataFrame({'Column1': [
                               'Oh great, 10,7', 
                               'Awesome, 20.3', 
                               '1.5', 
                               'Vaaw, 9/10']})

print (df['Column1'].str.extract('([0-9]+[,./]*[0-9]*)'))

输出:

      0
0  10,7
1  20.3
2   1.5
3  9/10