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

时间:2017-07-05 10:04:48

标签: string pandas

从每日报告中,我使用:

pd.read_csv(filepath, sep = '\t')

打开如下所示的数据框(简化格式):

finalDf2 = pd.DataFrame(dict(
            Portfolio = pd.Series(['Book1', 'Book1', 'Book2', 'Book3', 'Book1','Book1']), 
            Strike = pd.Series(['108','109.10', '111', '114', '108.3', '115.0']), 
            Notional = pd.Series(['0', '-0.02', '35', '. 3K', '-0.05K', '0' ]))
     )

在“名义”栏下的各种条目上运行以下内容:

type(finalDf2.iloc[ , ]

我看到0已经是int类型。
然而,非零值是字符串。我试图通过使用:

将字符串转换为浮点数
finalDf2['Notional'].astype(float)

但在此之前,我怎么能转换包含“K”值的所有单元格? 例如,

。 3K最终应该是浮动或int 30  -0。 05K最终应该是浮点数或int -50

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

2 个答案:

答案 0 :(得分:1)

这是一个可能的解决方案:

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

答案 1 :(得分:0)

首先,替换空格。

In [344]: s = finalDf2['Notional'].str.replace(' ', '0')

然后,提取数字部分和'K'部分,用1000替换K.

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