下面的原始答案适用于某些输入,但并不完全正确。使用问题中的数据框测试您的代码,我发现它有效,但不能保证适用于所有数据框。这是一个不起作用的示例:
df = pd.DataFrame(np.random.randn(6,4), index=list(range(0,12,2)), columns=['A', 'B', 'C', 'D'])
此数据框将导致您的代码失败,因为索引不是您的算法所期望的 0、1、2...,而是 0、2、4、...,如index=list(range(0,12,2)).
这意味着i迭代器返回的值也将是 0, 2, 4,...,因此当您尝试将其i-1用作iloc.
简而言之,当您使用for i, row in df.iterrows():迭代数据框时,i采用您正在迭代的维度的索引值,因为它们在 dataframe 中定义。确保在循环内将它们与偏移一起使用时知道这些值是什么。
原答案:
我无法弄清楚为什么您的代码不起作用,但我可以验证它不起作用。它可能与在迭代数据帧时修改数据帧有关,因为您可以使用df.iloc[1]['A'] = 0.0在循环外部设置值而没有问题。
尝试DataFrame.at改用:
for i, row in df.iterrows():
if row['A'] == 0.0:
df.at[i, 'A'] = df.iloc[i-1]['A'] + df.iloc[i]['B'] - df.iloc[i-1]['B']
这对返回数据框中的最后一行没有任何作用df.iloc[i-1],因此请注意,当 A 列中的第一个值为 0.0 时。