Skip to main content
 首页 » 编程设计

python之生成一行值 = 前一行的值 + 变化

2025年05月04日11youxin

我正在尝试创建一个 pandas 数据框,其中每个单元格的值是其上方单元格的值 + 一个变体。

我找到了一种几乎可以做我想做的事情的方法...

import pandas as pd, random 
 
max_deviation = 20 
nb_periods = 5 
colnames = ["col1", "col2"] 
 
df = pd.DataFrame(columns = colnames) 
df.loc[0] = 500 
for id_period in range(1, nb_periods): 
    df.loc[id_period] = df.loc[id_period-1] + random.randint(-max_deviation, max_deviation) 
 
df 
 
    col1 col2 
0    500  500 
1    485  485 
2    479  479 
3    479  479 
4    496  496 

当然,除此之外,应用于每一行的 random.randint(-max_deviation_each_period, max_deviation_each_period) 对于每个单元格都是相同的。我想要的是这样的:

    col1 col2 
0    500  500 
1    485  503 
2    479  522 
3    479  511 
4    496  494 

我怎样才能做到这一点?

请您参考如下方法:

这应该能为您提供所需的信息。生成 N * M 个随机数,找到它们沿第 0 个 轴的累积和,添加偏移量(即 500),然后加载到数据帧中。

i = 5           # number of rows 
j = 2           # number of columns 
max_dev = 20    # maximum deviation 

v = np.random.randint(-max_dev, max_dev + 1, (i, j)).cumsum(axis=0) + 500 
df = pd.DataFrame(v).rename(columns=lambda x: x + 1).add_prefix('col') 
 
df 
 
   col1  col2 
0   490   484 
1   473   473 
2   477   457 
3   484   465 
4   465   480 

如果您希望结果以 500 开头,则对上面的结果调用 shift + fillna -

df.shift().fillna(500).astype(int) 
 
   col1  col2 
0   500   500 
1   490   484 
2   473   473 
3   477   457 
4   484   465 

如果你愿意,把它变成一个函数——

def foo(i, j, max_dev=20, offset=500): 
    v = np.random.randint(-max_dev, max_dev + 1, (i, j)).cumsum(axis=0) + offset 
 
    return pd.DataFrame(v)\ 
             .rename(columns=lambda x: x + 1)\ 
             .add_prefix('col')\ 
             .shift()\ 
             .fillna(offset)\ 
             .astype(int) 

现在,使用适当的参数调用它 -

foo(5, 5) 
 
   col1  col2  col3  col4  col5 
0   500   500   500   500   500 
1   491   497   489   512   501 
2   480   502   501   495   486 
3   499   490   481   477   500 
4   503   494   488   496   512