我的数据框中有一个列,其值为' 3.456B'实际上代表了3.456亿(和Million相似的符号)。如何将此字符串形式转换为正确的数字表示?
这显示了数据框:
import pandas as pd
data_csv = pd.read_csv('https://biz.yahoo.com/p/csv/422conameu.csv')
data_csv
这是一个示例值:
data_csv['Market Cap'][0]
type(data_csv['Market Cap'][0])
我试过了:
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
但遗憾的是,M'最后表示数百万。它返回错误如下:
ValueError: invalid literal for float(): 6.46M
如何在此列中用适当的值替换B和M?有没有更好的方法呢?
答案 0 :(得分:4)
假设所有条目末尾都有一个字母,您可以这样做:
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)
这会将除最后一个字符之外的所有字符转换为数字值,然后将其乘以相当于最后一个字符中字母的数字。
答案 1 :(得分:3)
我使用字典替换字符串然后评估为float。
mapping = dict(K='E3', M='E6', B='E9')
df['Market Cap'] = pd.to_numeric(df['Market Cap'].replace(mapping, regex=True))
答案 2 :(得分:2)
首先提取单位作为字符串中的最后一个字符。然后将没有单位的值转换为浮点数并在需要时进行乘法运算:
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
现在一切都有数十亿。