Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何基于多个条件动态创建列_Python_Pandas_Dataframe_Multiple Columns_Multiple Conditions - Fatal编程技术网

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

Python 如何基于多个条件动态创建列,python,pandas,dataframe,multiple-columns,multiple-conditions,Python,Pandas,Dataframe,Multiple Columns,Multiple Conditions,所以我有以下问题: 我有一个数据帧,比如下面的一个数据帧,其中time_diff_float是每行和上面的行之间的时间差,单位为分钟。例如,在value=1后20分钟,我得到value=4 首先,我必须检查两行之间的时差是否小于60一小时,并使用公式rem=上面一行的值*λ**两行之间的时差创建一列。我的lambda是一个值为0.97的常数 然后,如果每一行和上面两行之间的时间差仍然小于60,我必须重新做同样的事情,比较每一行和上面两行。然后我要做同样的事情,比较上面的3行,等等 为此,我编写了

所以我有以下问题:

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

首先,我必须检查两行之间的时差是否小于60一小时,并使用公式rem=上面一行的值*λ**两行之间的时差创建一列。我的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))

它起作用了!这正是我要找的。非常感谢你:D
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))