将数据框乘以浮点数

时间:2019-07-31 18:17:07

标签: python pandas

背景故事:我有一个熊猫数据框,需要对其执行一系列计算。在最后一步,我需要获取df中的每一行,并将它们乘以权重数组,而实际的权重值取决于列名。


weightedData = pd.DataFrame()
weightedData['COL NAME0'] = scaledData['COL NAME0']

weights = {'COL NAME1': (2.14, 'E'), 'COL NAME2': (2.14, 'E'), 'COL NAME3': (2.14, 'E'), 'COL NAME4': (2.14, 'E')}

for col in scaledData:
    weightedData[col] = scaledData[col] * weights.get(col, (0.00, 'U'))[0]

scaledData df的列名与weights字典中列出的列名相同,因为它们是从同一源(SQL表)填充的。

                  COL NAME0 COL NAME1  ...    COL NAME3    COL NAME4
0                Alabama     4.099099  ...    2.042345      1.392755
1                 Alaska     1.396396  ...    1.000000      1.000000
2                Arizona     4.189189  ...    2.003257      1.537777
3               Arkansas     2.927928  ...    2.208723      1.007370
4             California     3.378378  ...    1.754930      2.012395
5               Colorado     3.378378  ...    3.282196      2.843435
6            Connecticut     5.000000  ...    1.452587      4.277286
7               Delaware     4.409692  ...    2.134501      1.970434
8   District of Columbia     5.000000  ...    1.000000      1.000000
9                Florida     4.628118  ...    1.806412      2.213038
10               Georgia     4.628118  ...    1.513896      2.748559
11                Hawaii     3.902494  ...    2.891694      3.872309
12                 Idaho     1.090703  ...    2.978469      4.127419
13              Illinois     4.537415  ...    1.242970      1.888353
14               Indiana     4.537415  ...    2.368881      2.307914
15                  Iowa     2.088435  ...    3.298368      3.421122
16                Kansas     2.723356  ...    2.791375      2.160330
17              Kentucky     3.902494  ...    1.692890      4.133744
18             Louisiana     2.451247  ...    1.000000      1.000000
19                 Maine     3.448980  ...    2.535328      5.000000
20              Maryland     5.000000  ...    1.632194      1.046567
21         Massachusetts     5.000000  ...    2.174075      2.503631
22              Michigan     4.804878  ...    1.000000      1.558339
23             Minnesota     4.024390  ...    2.989420      3.733538
24           Mississippi     3.634146  ...    1.000000      3.246507
25              Missouri     4.317073  ...    1.996358      1.000000
26               Montana     1.000000  ...    2.933104      2.140520
27              Nebraska     1.878049  ...    3.103421      2.880362
28                Nevada     4.414634  ...    1.000000      1.000000
29         New Hampshire     5.000000  ...    2.586207      3.877058
30            New Jersey     5.000000  ...    1.293103      3.533832


(有更多的列和行,但是为了简单起见,我包括了df的一部分)

但是,我遇到了似乎是Python的局限性的错误:

TypeError:无法将序列乘以'float'类型的非整数

问题是我的权重必须是这些已经定义的浮点值,并且遍历每行+每列并将权重分别应用于每个数据点似乎效率极低。

我应该采取什么策略来实现自己的目标?似乎我应该在寻找某种解决方法,但是我目前仍处于困境。

任何建议都值得赞赏。让我知道是否应提供更多信息。谢谢!

1 个答案:

答案 0 :(得分:1)

出于测试目的,我仅从DataFrame的最初几行创建了 df

    COL NAME0  COL NAME1  COL NAME2  COL NAME3  COL NAME4
0     Alabama   4.099099   4.090001   2.042345   1.392755
1      Alaska   1.396396   1.390001   1.000000   1.000000
2     Arizona   4.189189   4.180001   2.003257   1.537777
3    Arkansas   2.927928   2.920001   2.208723   1.007370
4  California   3.378378   3.780001   1.754930   2.012395

我也略微更改了权重,以使每列具有不同的数字:

weights = {'COL NAME1': (2, 'E'), 'COL NAME2': (3, 'E'),
    'COL NAME3': (4, 'E'), 'COL NAME4': (5, 'E')}

准备的第一步是仅选择数字部分(乘数) 来自 weights (没有'E')。

weights2 = { k: v[0] for k, v in weights.items() }

获取:

{'COL NAME1': 2, 'COL NAME2': 3, 'COL NAME3': 4, 'COL NAME4': 5}

整个乘法可以用指令执行:

df[[*weights2.keys()]] *= pd.Series(weights2)

结果是:

    COL NAME0  COL NAME1  COL NAME2  COL NAME3  COL NAME4
0     Alabama   8.198198  12.270003   8.169380   6.963775
1      Alaska   2.792792   4.170003   4.000000   5.000000
2     Arizona   8.378378  12.540003   8.013028   7.688885
3    Arkansas   5.855856   8.760003   8.834892   5.036850
4  California   6.756756  11.340003   7.019720  10.061975

如您所见,每列都已乘以适当的乘数。

上面的乘法指令包含3个技巧:

  1. [*weights2.keys()]提供了要乘以的列名列表。
  2. pd.Series(weights2)给出了“乘法系列” 相应的列名和乘数(每列)。
  3. 由于` = 运算符,该乘法是就地执行的。
相关问题