【问题标题】:How to dynamically create columns based on multiple conditions如何根据多个条件动态创建列
【发布时间】:2020-07-18 23:25:01
【问题描述】:

所以我遇到了以下问题:

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

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。

然后,如果每行和上面2行之间的时间差仍然低于60,我必须重新做同样的事情,比较每行和上面的2行。然后我必须做同样的事情比较上面的 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】:

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

    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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2021-03-19
    • 2017-01-17
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    相关资源
    最近更新 更多