【问题标题】:Python Pandas Group RecursionPython Pandas 组递归
【发布时间】:2018-09-15 19:36:53
【问题描述】:

我的问题与this 帖子密切相关。 假设我有以下数据集:

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:

对于所有其他观察 PER GROUP,行值计算如下:

value = (df.loc[i-1, "C"] + 3 * df.loc[i, "A"] + 1.65 * df.loc[i, "B"])
    return value

为了进一步澄清,以下是使用 excel 计算第 2 组的 Want 列的公式:F4="F5+(3*A4)+(1.65*B4)", F5="F6+(3*A5)+( 1.65*B5)", F6="F7+(3*A6)+(1.65*B6)", F7="A7+B7"。它具有某种“递归”性质,这就是我想到“for循环”的原因

我非常感谢与第一个 if 语句一致的解决方案。那是

value = something

而不是函数返回一个数据框或类似的东西,这样我就可以使用以下方法调用该函数

df["value"] = df.apply(calculate, axis=1)

感谢您的帮助。谢谢

【问题讨论】:

  • 您有机会检查解决方案吗?它奏效了吗? :)
  • @RafaelC 谢谢!效果很好
  • 所以请接受这个问题作为未来推荐的正确答案! ;)

标签: python pandas pandas-groupby


【解决方案1】:

这里不需要apply。通常,apply 非常慢,您应该避免这种情况。

然而,这种递归 特性的问题通常很难向量化。值得庆幸的是,您可以使用相反的 cumsumnp.where 来解决您的问题

df['Want'] = np.where(df['last'] == 1, df['A'] + df['B'], 3*df['A'] + 1.65*df['B'])
df['Want'] = df[::-1].groupby('Group')['Want'].cumsum()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 2016-04-12
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    相关资源
    最近更新 更多