我正在尝试在熊猫的数据框中添加一列,其中每个条目代表两个相邻行中另一列的值之间的差异(如果满足某些条件)。遵循对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
?
答案 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)