Cómo convertir números representados como caracteres para abreviar en numéricos en Python

Tengo una columna en mi dataframe que tiene valores como ‘3.456B’ que en realidad representa 3.456 mil millones (y una notación similar para millones). ¿Cómo convertir esta forma de cadena para corregir la representación numérica?

Esto muestra el dataframe:

import pandas as pd data_csv = pd.read_csv('https://biz.yahoo.com/p/csv/422conameu.csv') data_csv 

Este es un valor de muestra:

 data_csv['Market Cap'][0] type(data_csv['Market Cap'][0]) 

Intenté esto:

 data_csv.loc[data_csv['Market Cap'].str.contains('B'), 'Market Cap'] = data_csv['Market Cap'].str.replace('B', '').astype(float).fillna(0.0) data_csv 

Pero, desafortunadamente, también hay valores con ‘M’ al final que denota Millones. Devuelve el error de la siguiente manera:

     ValueError: invalid literal for float(): 6.46M 

    ¿Cómo puedo reemplazar B y M con los valores apropiados en esta columna? Hay una mejor manera de hacerlo?

    Suponiendo que todas las entradas tengan una letra al final, puedes hacer esto:

     d = {'K': 1000, 'M': 1000000, 'B': 1000000000} df.loc[:, 'Market Cap'] = pd.to_numeric(df['Market Cap'].str[:-1]) * \ df['Market Cap'].str[-1].replace(d) 

    Esto convierte todo menos el último carácter en un valor numérico, luego lo multiplica por el número equivalente a la letra en el último carácter.

    Usaría un diccionario para reemplazar las cadenas y luego evaluar como flotar.

     mapping = dict(K='E3', M='E6', B='E9') df['Market Cap'] = pd.to_numeric(df['Market Cap'].replace(mapping, regex=True)) 

    Primero extrae unidades como último personaje en cuerdas. Luego convierta los valores sin unidades a flotadores y multiplíquelos cuando sea necesario:

     df = pd.DataFrame({'Market Cap':['6.46M','2.25B','0.23B']}) units = df['Market Cap'].str[-1] df['Market Cap'] = df['Market Cap'].str[:-1].astype(float) df.loc[units=='M','Market Cap'] *= 0.001 # Market Cap # 0 0.00646 # 1 2.25000 # 2 0.23000 

    Ahora todo está en billones.