在pandas数据帧中将数字和字母串转换为int / float

时间:2013-01-08 15:45:22

标签: python pandas

我觉得必须快速解决我的问题,我使用多个列表推导法破解了一个实施不当的解决方案,这种解决方案并不理想。也许有人可以在这里帮忙。

我有一组值是字符串(例如3.2B,1.5M,1.1T),其中最后一个字符自然表示百万,十亿,万亿。在集合中还有NaN /'none'值,这些值应保持不变。我希望将它们转换为浮点数或整数,所以在给定的例子中(3200000000,1500000,1100000000000)

TIA

3 个答案:

答案 0 :(得分:6)

您可以创建一个函数:并applymap它到数据框中的每个条目:

powers = {'B': 10 ** 9, 'M': 10 ** 6, 'T': 10 ** 12}
# add some more to powers as necessary

def f(s):
    try:
        power = s[-1]
        return int(s[:-1]) * powers[power]
    except TypeError:
        return s

df.applymap(f)

答案 1 :(得分:3)

<强>设置
借用@ MaxU&#39; s pd.DataFrame

df = pd.DataFrame({'col': ['123.456', '78M', '0.5B']})

<强>解决方案
用科学记数法替换字符串然后使用astype(float)

d = dict(M='E6', B='E9', T='E12')

df.replace(d, regex=True).astype(float)

            col
0  1.234560e+02
1  7.800000e+07
2  5.000000e+08

答案 2 :(得分:2)

演示:

In [58]: df
Out[58]:
       col
0  123.456
1      78M
2     0.5B

In [59]: d = {'B': 10**9, 'M': 10**6}

In [60]: df['new'] = \
    ...: df['col'].str.extract(r'(?P<val>[\d.]+)\s*?(?P<mult>\D*)', expand=True) \
    ...:   .replace('','1') \
    ...:   .replace(d, regex=True) \
    ...:   .astype(float) \
    ...:   .eval('val * mult')
    ...:

In [61]: df
Out[61]:
       col           new
0  123.456  1.234560e+02
1      78M  7.800000e+07
2     0.5B  5.000000e+08