Использование re
:
Сначала мне пришлось удалить пустой строковый ключ из вашего units
:
units = {"M": 1_000, "B": 1_000_000, "T": 1_000_000_000, "%": .01}
Затем я перебираю все ваши элементы и все сохраненные единицы в измените все литералы на правильные арифметические операции c:
>>> num_formatted=[]
>>> for el in num:
... x=el
... for k in units:
... x=re.sub(r"([0-9\.]+)"+k, r"(\1 * "+str(units[k])+")", x)
... num_formatted.append(x)
...
>>> print(num_formatted)
['11.1', '(1.19 * 1000000000)', '22.14', '(2.09 * 1000000)', '(4.57 * 0.01)', '12.92', 'N/A', 'Dec 25 2019']
Благодаря такому подходу вы можете иметь более одной единицы на один литерал, и все должно быть вычислено арифметически правильно.
После этого сделано - мы можем просто eval
все отформатированные операции:
>>> import numpy as np
>>> num_formatted_final=[]
>>> for el in num_formatted:
... try:
... num_formatted_final.append(eval(el))
... except:
... num_formatted_final.append(np.nan) #You can put None instead - I suppose np.nan is more logical choice here
...
>>> num_formatted_final
[11.1, 1190000000.0, 22.14, 2089999.9999999998, 0.045700000000000005, 12.92, nan, nan]