我有一个数据框,
scraped_info = {
'prodname' : prodname,
'price' : price,
'description' : description,
'img' : img,
}
所以基本上公式是 new_col中的1个,我们首先设置1 *(1 + 3),然后设置4 *(1 + 4),然后设置20 *(1 + 3),依此类推。 我应该如何首先创建一个新列(new_col),然后在第一行添加1,然后执行计算。
答案 0 :(得分:1)
cumprod
df.assign(new_col=df.z.fillna(0).add(1).cumprod())
x y z new_col
0 NaN NaN NaN 1.0
1 1.0 2.0 3.0 4.0
2 2.0 3.0 4.0 20.0
3 2.0 1.0 3.0 80.0
试图保留dtype
df.assign(new_col=df.z.fillna(0, downcast='infer').add(1).cumprod())
x y z new_col
0 NaN NaN NaN 1
1 1.0 2.0 3.0 4
2 2.0 3.0 4.0 20
3 2.0 1.0 3.0 80
这一点是要说明如何执行依赖于线性路径的计算。 Numba的速度非常快,如果计算的时间复杂度为O(N),那么您不必担心在Numba中使用此循环。
如果您尚未安装numba
,并且不想安装它,只需移除@njit
装饰器。
from numba import njit
@njit
def f(a):
out = np.zeros_like(a)
out[0] = 1
for i, x in enumerate(a[1:], 1):
out[i] = out[i-1] * (1 + x)
return out
df.assign(new_col=f(df.z.values))
x y z new_col
0 NaN NaN NaN 1.0
1 1.0 2.0 3.0 4.0
2 2.0 3.0 4.0 20.0
3 2.0 1.0 3.0 80.0
使用int
df.assign(new_col=f(df.z.fillna(0).astype(int).values))
x y z new_col
0 NaN NaN NaN 1
1 1.0 2.0 3.0 4
2 2.0 3.0 4.0 20
3 2.0 1.0 3.0 80
答案 1 :(得分:0)
如果您正在寻找更简单的解决方案,这将有所帮助。
您可以仅创建一个名为“ new_column”的新列,并将所有值初始化为1(因为第一个值应为1)。
df['new_column'] = 1
然后,您可以使用for循环遍历行并根据您的公式更新新的列值。
for i in range(1, len(df)):
df.loc[i, 'new_column'] = df['new_column'][i-1] * (1 + df['Z'][i])