String Pandas:将表示数字的字符串(带字符)转换为float/int

String Pandas:将表示数字的字符串(带字符)转换为float/int,string,pandas,String,Pandas,根据每日报告,我使用: pd.read_csv(filepath, sep = '\t') 要打开如下所示的数据框(简化格式): 通过在“名义”栏下的各种条目上运行以下命令: 我看到0已经是int类型了。 但是,非零值是字符串。我尝试使用以下命令将字符串转换为浮点数: finalDf2['Notional'].astype(float) 但在此之前,如何转换所有包含“K”值的单元格? 比如说, 。3K应以浮动或整数30结束 -0.05K应该以浮点或int-50结束 间隔实际上在文件中,因此不

根据每日报告,我使用:

pd.read_csv(filepath, sep = '\t')
要打开如下所示的数据框(简化格式):

通过在“名义”栏下的各种条目上运行以下命令:

我看到0已经是int类型了。
但是,非零值是字符串。我尝试使用以下命令将字符串转换为浮点数:

finalDf2['Notional'].astype(float)
但在此之前,如何转换所有包含“K”值的单元格? 比如说,

。3K应以浮动或整数30结束
-0.05K应该以浮点或int-50结束


间隔实际上在文件中,因此不幸的是数据帧

以下是一个可能的解决方案:

def notional_to_num(x):
    if isinstance(x, (int, float)):
        return x
    elif isinstance(x, str):
        return x if 'K' not in x else float(x.replace(" ", "0")[:-1])*1e3
    else:
        raise

finalDf2.loc[:, 'Notional'] = finalDf2['Notional'].apply(notional_to_num)
这将提供以下输出:

  Notional Portfolio  Strike
0        0     Book1     108
1    -0.02     Book1  109.10
2       35     Book2     111
3       30     Book3     114
4      -50     Book1   108.3
5        0     Book1   115.0
首先,替换空格

In [344]: s = finalDf2['Notional'].str.replace(' ', '0')
然后,提取数字部分和“K”部分,将K替换为1000

In [345]: (s.str.extract(r'(-?[\d\.]+)', expand=False).astype(float) *
           s.str.extract(r'([K]+)', expand=False).replace([np.nan, 'K'], [1, 1000]) )
Out[345]:
0     0.00
1    -0.02
2    35.00
3    30.00
4   -50.00
5     0.00
Name: Notional, dtype: float64

十进制值中的额外空格是否表示零?“.3”代表“.03”?
。3K应以浮动或int 30结束-005K应该是float或int-50
这两行相互矛盾。是否应将空格转换为
'0'
'
谢谢FLab。我混合使用了上面John的答案,首先使用:finalDf2['colName1']=finalDf2['colName1'].str.replace('0')。。。finalDf2['colName9']=finalDf9['colName9'].str.replace(''0')到各个列。这是为了去掉句点后的任何空格。然后使用:finalDf.fillna(value=0,inplace=True)将NaN转换为0s。最后,稍微修改了您的函数以处理另一个异常(我的实际数据帧中有一些条目是随机的。**),并将其应用到各个列以获得更清晰的df。很高兴它有帮助!如果你觉得答案有用,别忘了投票/接受,或者上传你的答案以便对其他人有用。谢谢你,约翰。我用了第一部分。第二部分在我的实际数据帧上产生了一个错误,因为我认为“无法将字符串转换为float:”
In [344]: s = finalDf2['Notional'].str.replace(' ', '0')
In [345]: (s.str.extract(r'(-?[\d\.]+)', expand=False).astype(float) *
           s.str.extract(r'([K]+)', expand=False).replace([np.nan, 'K'], [1, 1000]) )
Out[345]:
0     0.00
1    -0.02
2    35.00
3    30.00
4   -50.00
5     0.00
Name: Notional, dtype: float64