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

4 投票
2 回答
2123 浏览
提问于 2025-04-17 21:56

我有一个从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数据框?

补充说明:这个答案很好用!谢谢你。顺便问一下,这个函数是怎么工作的?

2 个回答

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]
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

撰写回答