发生移位:使用熊猫移位来合并行

时间:2019-03-20 16:04:16

标签: pandas

我正在尝试在熊猫的数据框中添加一列,其中每个条目代表两个相邻行中另一列的值之间的差异(如果满足某些条件)。遵循对get previous row's value and calculate new column pandas python的回答之后,我正在使用shift在两行的duration_seconds列条目之间找到增量(下一个减去当前值),然后将该增量作为派生条目返回,如果这两行都来自相同的user_id,下一行的action不是'login',且增量不是负数。这是代码:

def duration (row):
    candidate_duration = row['duration_seconds'].shift(-1) - row['duration_seconds']
    if row['user_id'] == row['user_id'].shift(-1) and row['action'].shift(-1) != 'login' and candidate_duration >= 0:
        return candidate_duration
    else:
        return np.nan

然后我使用

测试功能
analytic_events.apply(lambda row: duration(row), axis = 1)

但这会引发错误:

  

AttributeError :(“ int”对象没有属性“ shift””,“发生在索引9464384')

我想知道这是否类似于错误修复的here,所以我尝试这样传递整个数据帧:

duration(analytic_events)

但是会引发错误:

  

ValueError:系列的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

我应该怎么做才能实现这种结合;我应该如何使用shift

1 个答案:

答案 0 :(得分:2)

没有看到您的数据。您可以使用np.where有条件地创建列来简化此操作:

cond1 = analytic_events['user_id'] == analytic_events['user_id'].shift(-1)   
cond2 = analytic_events['action'].shift(-1) != 'login'
cond3 = analytic_events['duration_seconds'].shift(-1) - analytic_events['duration_seconds'] >= 0

analytic_events['candidate_duration'] = np.where((cond1) & (cond2) & (cond3), 
                                                 analytic_events['duration_seconds'].shift(-1) - analytic_events['duration_seconds'], 
                                                 np.NaN)

说明 np.where的工作方式如下:np.where(condition, value if true, value is false)