如何根据多个条件动态创建列
How to dynamically create columns based on multiple conditions
所以我遇到了以下问题:
我有一个像下面这样的数据框,其中 time_diff_float
是每一行和上面一行之间的时间差,以分钟为单位。因此,例如,我 value = 4
在 value = 1
.
之后 20 分钟
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 列”?
提前致谢!
您可以保存数据掩码,然后在每次循环时更新它:
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))
所以我遇到了以下问题:
我有一个像下面这样的数据框,其中 time_diff_float
是每一行和上面一行之间的时间差,以分钟为单位。因此,例如,我 value = 4
在 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 列”?
提前致谢!
您可以保存数据掩码,然后在每次循环时更新它:
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))