在Python列中将数百万和十亿转换为数字或整数

在Python列中将数百万和十亿转换为数字或整数,python,pandas,Python,Pandas,我有一个列,它的值像“1000万”和“50亿”,我想用一种简单的方法把它转换成一个数值来做进一步的分析。 我试过了 powers = {'billion': 10 ** 9, 'million': 10 ** 6} def f(s): try: power = s[-1] return float(s[:-1]) * powers[power] except TypeError: return s df_2.applymap(f

我有一个列,它的值像“1000万”和“50亿”,我想用一种简单的方法把它转换成一个数值来做进一步的分析。 我试过了

powers = {'billion': 10 ** 9, 'million': 10 ** 6}

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

df_2.applymap(f)
更新:MyPandas列由0(NaN)和其他值组成,包括数百万和数十亿。 我希望这比上一次更清楚 我使用了下面@MobiusKlein推荐的方法。 下面是有用的堆栈跟踪错误

    ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-1db4b2353170> in <module>()
     10       return float(quantity) * powers[magnitude]
     11 
---> 12 df_2.applymap(f)
     13 

/home/peadarcoyle/.virtualenvs/Ipython/local/lib/python2.7/site-packages/pandas/core/frame.pyc in applymap(self, func)
   3725                 x = lib.map_infer(_values_from_object(x), f)
   3726             return lib.map_infer(_values_from_object(x), func)
-> 3727         return self.apply(infer)
   3728 
   3729     #----------------------------------------------------------------------

/home/peadarcoyle/.virtualenvs/Ipython/local/lib/python2.7/site-packages/pandas/core/frame.pyc in apply(self, func, axis, broadcast, raw, reduce, args, **kwds)
   3556                     if reduce is None:
   3557                         reduce = True
-> 3558                     return self._apply_standard(f, axis, reduce=reduce)
   3559             else:
   3560                 return self._apply_broadcast(f, axis)

/home/peadarcoyle/.virtualenvs/Ipython/local/lib/python2.7/site-packages/pandas/core/frame.pyc in _apply_standard(self, func, axis, ignore_failures, reduce)
   3646             try:
   3647                 for i, v in enumerate(series_gen):
-> 3648                     results[i] = func(v)
   3649                     keys.append(v.name)
   3650             except Exception as e:

/home/peadarcoyle/.virtualenvs/Ipython/local/lib/python2.7/site-packages/pandas/core/frame.pyc in infer(x)
   3724                 f = com.i8_boxer(x)
   3725                 x = lib.map_infer(_values_from_object(x), f)
-> 3726             return lib.map_infer(_values_from_object(x), func)
   3727         return self.apply(infer)
   3728 

/home/peadarcoyle/.virtualenvs/Ipython/local/lib/python2.7/site-packages/pandas/lib.so in pandas.lib.map_infer (pandas/lib.c:56671)()

<ipython-input-12-1db4b2353170> in f(num_str)
      4 
      5 def f(num_str):
----> 6    match = re.search(r"([0-9\.]+)\s?(million|billion)", num_str)
      7    if match is not None:
      8       quantity = match.group(0)

/home/peadarcoyle/.virtualenvs/Ipython/lib/python2.7/re.pyc in search(pattern, string, flags)
    140     """Scan through string looking for a match to the pattern, returning
    141     a match object, or None if no match was found."""
--> 142     return _compile(pattern, flags).search(string)
    143 
    144 def sub(pattern, repl, string, count=0, flags=0):

TypeError: ('expected string or buffer', u'occurred at index Intended_Investment')
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
10返回浮动(数量)*功率[量级]
11
--->12 df_2.应用映射(f)
13
/applymap中的home/peadarcoyle/.virtualenvs/Ipython/local/lib/python2.7/site-packages/pandas/core/frame.pyc(self,func)
3725 x=lib.map\u expert(来自对象(x,f)的值)
3726返回lib.map\u推断(\u值\u来自\u对象(x),func)
->3727返回自我应用(推断)
3728
3729     #----------------------------------------------------------------------
/home/peadarcoyle/.virtualenvs/Ipython/local/lib/python2.7/site-packages/pandas/core/frame.pyc在应用中(self、func、axis、broadcast、raw、reduce、args、**kwds)
3556如果reduce为None:
3557 reduce=True
->3558自动返回。应用标准(f,轴,减少=减少)
3559其他:
3560返回自应用广播(f轴)
/home/peadarcoyle/.virtualenvs/Ipython/local/lib/python2.7/site-packages/pandas/core/frame.pyc在应用标准中(self、func、axis、忽略故障、reduce)
3646请尝试:
3647用于枚举中的i、v(系列):
->3648结果[i]=func(v)
3649键。追加(v.name)
3650例外情况除外,如e:
/推断(x)中的home/peadarcoyle/.virtualenvs/Ipython/local/lib/python2.7/site-packages/pandas/core/frame.pyc
3724 f=com.i8_boxer(x)
3725 x=lib.map\u expert(来自对象(x,f)的值)
->3726返回lib.map\u推断(\u值\u来自\u对象(x),func)
3727返回自我应用(推断)
3728
/home/peadarcoyle/.virtualenvs/Ipython/local/lib/python2.7/site-packages/pandas/lib.so in pandas.lib.map_infere(pandas/lib.c:56671)()
在f中(num_str)
4.
5 def f(num_str):
---->6匹配=重新搜索(r“([0-9\.]+)\s?(百万亿)”,数量
7如果匹配项不是无:
8数量=匹配组(0)
/搜索中的home/peadarcoyle/.virtualenvs/Ipython/lib/python2.7/re.pyc(模式、字符串、标志)
140''扫描字符串,查找与模式匹配的内容,返回
141匹配对象,如果找不到匹配项,则为“无”
-->142返回编译(模式、标志)。搜索(字符串)
143
144 def sub(模式、应答、字符串、计数=0、标志=0):
TypeError:('expected string or buffer',u'发生在预期投资的索引上')

查询数字词字符串的函数不考虑空格或多个数字的前导。尝试更复杂一点的方法:

import re
powers = {'billion': 10 ** 9, 'million': 10 ** 6}

def f(num_str):
   match = re.search(r"([0-9\.]+)\s?(million|billion)", num_str)
   if match is not None:
      quantity = match.group(0)
      magnitude = match.group(1)
      return float(quantity) * powers[magnitude]

如果无法从字符串中提取正确的标记,但它处理空白和不规则的幂,则会引发错误。如果您担心浮点错误,可以使用int()将数量转换为数字类型,但请确保您没有处理小数。如果是的话,你可以玩大小游戏来解决这个问题,但这会使代码比第一次通过时所需的更复杂。

你能适当地缩进代码吗?像这样的方法可能会有帮助。。。如果您需要特定问题的帮助,您应该发布您的错误,因为您没有得到“堆栈跟踪错误”。您收到一条错误消息,其中包含一个非常有用的堆栈跟踪,告诉您如何查找问题。非常感谢MobiusKlein和其他人提供有用的反馈。我在上面编辑了它来修正下面的内容。