使用if语句-pandas.append在for循环中的作用域不能在循环中起作用

时间:2018-02-08 21:57:16

标签: python pandas for-loop scope

这段代码返回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函数中的参数预测每种产品余额的变化。然后我会添加所有更改以得出余额的净变化(使用分组日期和总和余额完成)。

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

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

但是append不能扩展输出DataFrame。

1 个答案:

答案 0 :(得分: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')
)

隐藏了循环,因此您不必担心索引。确保您的函数以这样的方式编写,以便支持标量参数。