背景故事:我有一个熊猫数据框,需要对其执行一系列计算。在最后一步,我需要获取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'类型的非整数
问题是我的权重必须是这些已经定义的浮点值,并且遍历每行+每列并将权重分别应用于每个数据点似乎效率极低。
我应该采取什么策略来实现自己的目标?似乎我应该在寻找某种解决方法,但是我目前仍处于困境。
任何建议都值得赞赏。让我知道是否应提供更多信息。谢谢!
答案 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个技巧:
[*weights2.keys()]
提供了要乘以的列名列表。pd.Series(weights2)
给出了“乘法系列”
相应的列名和乘数(每列)。