【发布时间】:2021-02-28 19:41:25
【问题描述】:
我想在聚合时运行一些复杂的数学运算。我写了聚合函数:
import math as mt
# convert calc cols to float from object
cols = dfg_dom_smry.columns
cols = cols[2:]
for col in cols:
df[col] = df[col].astype(float)
# groupby fields
index = ['PA']
#aggregate
df = dfdom.groupby(index).agg({'newcol1': (mt.sqrt(sum('savings'*'rp')**2))/sum('savings')})
我收到一个错误:TypeError: can't multiply sequence by non-int of type 'str'
这是我的数据的摘录。完整的数据有许多组储蓄和 rp 列。所以理想情况下,我想为每组储蓄和 rp 列运行一个 for 循环
PA domain savings rp
M M-RET-COM 383,895.36 0.14
P P-RET-AG 14,302,804.19 0.16
P P-RET-COM 56,074,119.28 0.33
P P-RET-IND 46,677,610.00 0.27
P P-SBD/NC-AG 1,411,905.00 -
P P-SBD/NC-COM 4,255,891.25 0.36
P P-SBD/NC-IND 295,365.00 -
S S-RET-AG 2,391,504.33 0.72
S S-RET-COM 19,195,073.84 0.18
S S-RET-IND 17,677,708.38 0.13
S S-SBD/NC-COM 6,116,407.07 0.05
D D-RET-COM 11,944,490.39 0.15
D D-RET-IND 1,213,117.63 -
D D-SBD/NC-COM 2,708,153.57 0.69
C C-RET-AG
C C-RET-COM
C C-RET-IND
对于上述数据,这将是最终结果:
PA newcol1
M 0.143027374757981
P 0.18601700701305
S 0.0979541706738756
D 0.166192684106493
C
感谢您的帮助
【问题讨论】:
-
斯科特,这就是它的作用:
for col in cols: df[col] = df[col].astype(float)。之后我确认节省是 float64 格式。另外,我注释掉了我在下面发布的解决方案的浮点转换,它运行良好。还有其他建议吗? -
抛开表达式的可操作性:
mt.sqrt(sum('savings'*'rp')**2)有什么意义?起初,我以为你想要的是平方和。但看起来你想要总和的平方......然后是平方根......如果没有负值,这没有什么意义......我认为你想要的是平方值的总和...... -
说得对,它是用来处理绝对数字的。这是相对精度的汇总。您希望在计算中包含负节省,因此平方首先会处理负数。
-
那么为什么不使用
abs呢?我认为这会提高可读性。 -
好问题。我认为这可能是其他原因,因为 (a2 + b2 + c2)^1/2 不等于 a+b+c,即使没有负数。我不是统计学家。会回到我的同事那里,找出答案。
标签: python pandas pandas-groupby aggregate