【问题标题】:Scoping in for loop with if statement- pandas.append does not work in loop使用 if 语句限定 for 循环的范围 - pandas.append 在循环中不起作用
【发布时间】:2018-02-08 21:57:15
【问题描述】:

这段代码返回 10,这是我所期望的

for i in range(5):
    if i == 0:
        output = i
    else:
        output += i
print(output)

为什么这段代码只返回在语句的 if 部分创建的数据框(即当 i ==0 时)?

for i in range(5):    
    if i == 0:
        output = pd.DataFrame(np.random.randn(5, 2))
    else:
        output.append(pd.DataFrame(np.random.randn(5, 2))
print('final', output)

以上是我在使用以下代码时遇到的问题的 MVCE:

如有兴趣,请提供更多上下文:

for index, row in per_dmd_df.iterrows():
    if index == 0:
        output = pd.DataFrame(dmd_flow(row.balance, dt.date(2018,1,31),12,.05,0,.03,'monthly'))
    else:
        output.append(pd.DataFrame(dmd_flow(row.balance, dt.date(2018,1,31),12,.05,0,.03,'monthly')))
print(output)

我有一个输入 DataFrame,每个产品一行包含余额、费率等。我希望每个 DF 行中的数据调用 dmd_flow 函数(返回一个生成器,在 pd.Dataframe() 中调用时返回一个12 个月前瞻性余额预测)根据 dmd_flow 函数中的参数预测每个产品的余额变化。然后,我将添加所有更改以得出余额的净变化(在日期使用 group by 并汇总余额)。

每次调用都会根据需要创建新的 DataFrame:

pd.DataFrame(dmd_flow(row.balance, dt.date(2018,1,31),12,.05,0,.03,'monthly'))

但附加不能扩展输出数据帧。

【问题讨论】:

    标签: python pandas for-loop scope


    【解决方案1】:

    因为,(与list.append 不同)DataFrame.append 不是就地操作。有关更多信息,请参阅文档。您应该将结果分配回去:

    df = df.append(...)
    

    虽然在这种情况下,如果您无法对函数进行矢量化,我建议您使用类似 apply 的内容:

    df['balance'].apply(
         dmd_flow, args=(dt.date(2018,1,31), 12, .05, 0, .03, 'monthly')
    )
    

    其中隐藏了循环,因此您无需担心索引。确保您的函数以支持标量参数的方式编写。

    【讨论】:

    • @coldspeed,谢谢!我没有意识到它没有到位,因为文档显示 a.append(b),并且在 Dataframe.append 页面中没有提及到位。我将看看如何对函数进行矢量化。我不清楚这意味着什么。
    • @ivan7707 文档还提到了返回值:Returns: appended : DataFrame。向量化函数是可以对整个系列/列进行操作的函数,而不是一次操作一个值。如果您不知道它是什么,请暂时不要担心。
    • @coldspeed,哈,我认为这意味着它将其附加到原始 DF 中。感谢您的澄清。听起来矢量化就像 SQL vs cursor 中基于集合的查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2018-11-05
    • 2018-07-13
    • 2014-03-13
    • 1970-01-01
    相关资源
    最近更新 更多