找到“ M”并乘以一百万,然后找到“ B”并乘以十亿

时间:2019-06-14 21:50:26

标签: python python-3.x pandas

我正在下载财务数据,并且有几列包含如下所示的数据点:

34.60B
18.66M

这发生在列号为“ Market Cap”的第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)

2 个答案:

答案 0 :(得分:4)

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

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

由于您使用的是熊猫,因此将其应用于列的最简单方法是将其包装在函数中并使用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)

答案 1 :(得分:0)

您可以使用string.replace

假设您已将值提取为字符串,如下所示:

strs = ['34.60B', '18.66M']

那你就可以做

nums = []

for str in strs:
    rep = str.replace('B', 'e9')
    rep = rep.replace('M', 'e6')
    nums.append(float(rep))

然后

>>> nums
[34600000000.0, 18660000.0]