首页 > 解决方案 > 找到“M”并将数字乘以 100 万,然后找到“B”并将数字乘以 10 亿

问题描述

我正在下载财务数据,我有几列数据点如下所示:

34.60B
18.66M

这发生在第 6 列中,其标题为“市值”。它也出现在第 41 列中,该列有一个名为“Avg Volume”的标题。如何找到带有“M”的单元格并将这些值乘以一百万,同样地,找到带有“B”的单元格并将这些值乘以十亿,最后将带有“K”的值乘以一千?我正在尝试将所有内容都转换为数字,因此我没有将文本和数字混合在一起。

这是我所指的数据示例:

                                 Industry Country Market Cap     P/E    PEG
0         Medical Laboratories & Research     USA     22.29B   19.94   1.88   
1                                Aluminum     USA      4.07B    0.00   0.00   
2                    Exchange Traded Fund     USA          0    0.00   0.00   
3                        Asset Management     USA     34.60B    0.00   0.00   
4             Specialized Health Services     USA     18.66M    0.00   0.00   
5                    Exchange Traded Fund     USA          0    0.00   0.00   
6                          Major Airlines     USA     14.96B   10.83   0.75

这是我正在使用的代码。

import pandas  as pd
from pandas import read_csv
from sklearn.ensemble import ExtraTreesClassifier
# load data

df = pd.read_csv('C:\\path_here\\stocks.csv')
print(df)

for index, row in df.head(n=2).iterrows():
     print(index, row)

标签: pythonpython-3.xpandas

解决方案


您必须将值作为字符串进行迭代,因为字母会阻止转换为数字类型。然后你可以像这样修剪和缩放:

if value.endswith("M"):
    value = float(value[:-1]) * 10**6
elif value.endswith("B"):
    value = float(value[:-1]) * 10**9
else:
    value = float(value)

由于您使用的是 pandas,因此将其应用于列的最简单方法是将其包装在一个函数中并使用 ehm, apply

def convert_scale(value):
    if value.endswith("M"):
        return float(value[:-1]) * 10**6
    elif value.endswith("B"):
        return float(value[:-1]) * 10**9
    else:
        return float(value)

df["PEG"] = df["PEG"].apply(convert_scale)
df["Avg Volume"] = df["Avg Volume"].apply(convert_scale)

推荐阅读