在数据框列上进行计算的最优雅方法

时间:2018-08-20 16:55:49

标签: python dataframe calculation

我是python的新手。

我在pandas数据框中有一个名为[weight]的列。

哪种方法最有效,最明智的方法是将证券的权重重新定义为1(或100%)?类似于下面的示例计算

        weight  new weight
        0,05    14%
        0,10    29%
        0,20    57%
total   0,35    100%

df = pd.DataFrame({'Security' : ['ABC','DEF','GHI'], 'Rating': ['AAA', 'BBB','AA'], 'Weight' : [ 0.05, 0.1, 0.2]})

print(df)

Security Rating  Weight
   ABC    AAA    0.05
   DEF    BBB    0.10
   GHI     AA    0.20

2 个答案:

答案 0 :(得分:0)

我认为我们可以用权重之和来表示权重,并获得权重的百分比(newWeight):

import pandas as pd
df = pd.DataFrame({'Security' : ['ABC','DEF','GHI'], 'Rating': ['AAA', 'BBB','AA'], 'Weight' : [ 0.05, 0.1, 0.2]})
df['newWeight'] = 100 * df['Weight'] / sum(df['Weight'])
print(df)

##   Rating Security  Weight  newWeight
## 0    AAA      ABC    0.05  14.285714
## 1    BBB      DEF    0.10  28.571429
## 2     AA      GHI    0.20  57.142857

答案 1 :(得分:0)

使用apply方法是解决此问题的一种好方法。您可以执行以下操作:

import pandas as pd
df = pd.DataFrame({'Security' : ['ABC','DEF','GHI'], 'Rating': ['AAA', 'BBB','AA'], 'Weight' : [ 0.05, 0.1, 0.2]})
total = df.Weight.sum()
df['newWeight'] = df.Weight.apply(lambda x: x / total)

生成的DataFrame如下所示:

  Security Rating  Weight  newWeight
0      ABC    AAA    0.05   0.142857
1      DEF    BBB    0.10   0.285714
2      GHI     AA    0.20   0.571429

如果要将它们表示为百分比,则需要将它们转换为字符串,这是一个示例:

df['percentWeight'] = df.newWeight.apply(lambda x: "{}%".format(round(x * 100)))

结果如下:

  Security Rating  Weight  newWeight percentWeight
0      ABC    AAA    0.05   0.142857           14%
1      DEF    BBB    0.10   0.285714           29%
2      GHI     AA    0.20   0.571429           57%