我的熊猫数据框中的一列同时包含数字和字符串值。我尝试了几个答案,但对于已经只包含数字值的单元格却获得了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就可以了
答案 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