我有一个从sql表中选择的数据框,看起来像这个
id shares_float
0 1 621.76M
1 2 329.51M
换句话说,
[(1, '621.76M'), (2, '329.51M')]
我想分割shares_float,如果它是' B',则乘以1,000,000,000,如果它是' M',则乘以1,000,000,如果它不是,或者不是' t有尾随字符只需转换并分配号码。
结果应该是浮动类型
ticker_id shares_float float_value
0 1 621.76M 621760000.00
1 2 3.51B 3510000000.00
我是熊猫的新手。有没有办法在熊猫中做到这一点?或者我应该将数据转换为列表并在循环中进行操作然后将其转换回pandas DataFrame?
注意补充: 答案很有效!谢谢。顺便说一下,这个功能如何运作?
答案 0 :(得分: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
答案 1 :(得分:1)
你可以使用字符串方法来提取模式;例如,为了涵盖所有情况,从:
开始>>> 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]