如何基于多个条件动态创建列

问题描述 投票:0回答:1

所以我遇到以下问题:

我有一个像下面这样的数据帧,其中time_diff_float是每行和上面的行之间的时间差,以分钟为单位。因此,例如,我在value = 4之后20分钟有value = 1

value | time_diff_float
1       NaN
4       20
3       13
2       55
5       08
7       15

首先,我必须检查两行之间的时间差是否小于60(一个小时),并使用公式rem = value (from row above) * lambda ** time difference between 2 rows创建一列。我的lambda是一个常数,值为0.97。

然后,如果每行与上面两行之间的时间差仍小于60,我必须重新比较同一行与上面两行之间的时间。然后我必须做同样的事情,比较上面的3行,等等。

为此,我编写了以下代码:

df.loc[df['time_diff_float'] < 60, 'rem_1'] = df['value'].shift() * (lambda_ ** (df['time_diff_float'] - 1))
df.loc[df['time_diff_float'] + df['time_diff_float'].shift() < 60, 'rem_2'] = df['value'].shift(2) * (lambda_ ** (df['time_diff_float'] + df['time_diff_float'].shift() - 1))
df.loc[df['time_diff_float'] + df['time_diff_float'].shift() + df['time_diff_float'].shift(2) < 60, 'rem_3'] = df['value'].shift(3) * (lambda_ ** (df['time_diff_float'] + df['time_diff_float'].shift() + df['time_diff_float'].shift(2) - 1))

我的问题是:由于我必须使用我的实际值至少重复10次(甚至更多次),有没有办法动态创建“ rem列”?

提前感谢!

python pandas dataframe multiple-columns multiple-conditions
1个回答
0
投票

您可以保存数据掩码,然后在每次循环时更新它:

n = 3
for i in range(1, n):
    if (i==1):
        mask = df['time_diff_float']
        df.loc[mask, 'rem_' +str(i)] = df['value'].shift() * (lambda_ ** (mask - 1))

    else:
        mask += df['time_diff_float'].shift(i-1)
        df.loc[mask < 60, 'rem_'+str(i)] = df['value'].shift(i) * (lambda_ ** (mask - 1))
© www.soinside.com 2019 - 2024. All rights reserved.