pandas - 组内的 Python Pandas 自下而上计算
问题描述
假设我有以下数据集:
df = pd.DataFrame({"A":range(1,10), "B":range(5,14), "Group":
[1,1,2,2,2,2,3,3,3],"C":[0,0,10,0,0,16,0,0,22], "last":[0,1,0,0,0,1,0,0,1],
"Want": [19.25,8,91.6,71.05,45.85,16,104.95,65.8,22]})
对于每组的最后一次观察,我有以下代码:
def calculate(df):
if (df.last == 1):
value = df.loc["A"] + df.loc["B"]
else:
对于每组的所有其他观察,行值计算如下:
value = (df.loc[i-1, "C"] + 3 * df.loc[i, "A"] + 1.65 * df.loc[i, "B"])
return value
用简单的英语来说,这就是我想要做的。对于每组中的最后一个观察值,列C
等于列的总和A and B
对于所有其他观察结果,我想C
使用上面的“else statement”(用于概念证明)从“自下而上”计算列的值。
为了进一步澄清,这些是使用 excel计算Want
列的公式:它具有某种“递归”性质,这就是我想到“for循环”的原因Group 2
F4="F5+(3*A4)+(1.65*B4)", F5="F6+(3*A5)+(1.65*B5)", F6="F7+(3*A6)+(1.65*B6)", F7="A7+B7".
我真的很感激一个与第一个一致的解决if statement.
方案
value = something
而不是函数返回一个数据框或类似的东西,这样我就可以使用以下方法调用该函数
df["value"] = df.apply(calculate, axis=1)
感谢您的帮助。谢谢
解决方案
看来你np.where
需要shift
np.where(df.last==1,df.A+df.B,df.A+1.65*df.B+df.C.shift())
Out[199]: array([ nan, 11.9 , 14.55, 27.2 , 19.85, 22.5 , 41.15, 27.8 , 30.45])
推荐阅读
- api - 如何超越 OpenSea Api 的限制?
- r - 如何使函数返回两列不同类型(R)?
- r - 获取具有可变每日读数的时间序列数据中的所有可能组合
- sql - Query to replace last occurrence in postgres 8.3
- php - 仅将由相同特定符号包围的值包含到 php 数组中
- reactjs - 如何使用 axios get 请求发送带有标头的正文数据
- javascript - 有没有更好的方法来循环遍历这样的字符串数组?
- node.js - 无法从 getEvents API 访问时序见解冷库
- firebase - Flutter [firebase_auth] onAuthStateChanged 停止监听
- vue.js - 带有 Vue js 和 Open Weather Map API 和 7 天天气预报的天气应用程序