pandas: 从数字字符串中提取或分离字符

4

我有一个从SQL表中选择的数据框,看起来像这样

   id shares_float
0   1      621.76M
1   2      329.51M

换句话说,
[(1, '621.76M'), (2, '329.51M')]

我希望将shares_float进行拆分,如果它是'B',则乘以10亿,如果是'M',则乘以100万,如果既不是这两者,也没有尾随字符,就转换并分配该数字。

结果应该是浮点类型。

   ticker_id  shares_float     float_value
0          1       621.76M    621760000.00
1          2         3.51B   3510000000.00

我刚接触pandas。是否有一种使用pandas的方法?或者我应该将数据转换为列表,在循环中进行操作,然后将其转换回pandas DataFrame?

注释添加: 答案非常好!谢谢。 顺便问一下,这个函数是如何工作的?

2个回答

5

可能需要一个转换字典,我相信你的意思不是 624540000

In [9]:

D={'M':'*1e6', 'B':'*1e9'}
df['float_value']=df.shares_float.apply(lambda x: eval(x[:-1]+D[x[-1]]))
In [10]:

print df
   ticker_id shares_float  float_value
0          1      621.76M   621760000
1          2        3.51B  3510000000

[2 rows x 3 columns]
In [11]:

df.dtypes
Out[11]:
ticker_id         int64
shares_float     object
float_value     float64
dtype: object

谢谢!这个完美地运行了。我只是好奇,eval(x[:-1]+D[x[-1]])是如何工作的? - vt2424253
一百万是 1e6 而不是 10e6;同样地,10e9 是十亿。 - behzad.nouri
是的,对于那个额外的 0 我很抱歉。eval 基本上会运行提供给它的字符串作为 python 代码。 - CT Zhu

2
你可以使用字符串方法来提取模式;例如,为了涵盖所有情况,从以下内容开始:
>>> df
   id shares_float
0   1            5
1   2           6M
2   3           7B

[3 rows x 2 columns]

可以通过以下方式提取数值和单位:

>>> sh = df.shares_float.str.extract(r'(?P<val>[0-9.]*)(?P<unit>[MB]{0,1})')
>>> sh
  val unit
0   5
1   6    M
2   7    B

[3 rows x 2 columns]

然后:

>>> unit_map = {'':1, 'M':1e6, 'B':1e9}
>>> df['float_value'] = sh.val.astype(np.float64) * sh.unit.map(unit_map)
>>> df
   id shares_float  float_value
0   1            5            5
1   2           6M      6000000
2   3           7B   7000000000

[3 rows x 3 columns]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接