我有按ID和时间排序的数据帧,请参阅下文:
ID TIME VAR 1 VAR 2
001 1h x 1
001 2h y 2
001 3h x 1
001 4h z 1
002 1h x 1
002 2h x 2
002 3h z 1
我想在这个条件下添加一个变量CR:
- if for a same id, it(the id) already had VAR2 = 2, and after that, VAR1 = X.
- Then CR = 1, else 0.
最终的df应该是这样的:
ID TIME VAR 1 VAR 2 CR
001 1h x 1 0
001 2h y 2 0
001 3h x 1 1
001 4h x 1 1
002 1h x 1 0
002 2h x 2 0
002 3h z 1 0
我不知道如何获取ID的历史值并影响值1.
我认为有2个循环可能,我设法为TIME创建排名,但不是ID。我试过那段代码:
`cumul = 1
i=1
while i < df.USER_ID.count() :
if df.USER_ID[i:(i+1)] == df.USER_ID[(i+1):(i+2)]:
cumul == cumul
else :
cumul +=1
i +=1`
它显示错误:系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。
感谢您的帮助。
答案 0 :(得分:0)
如错误消息提示,请执行(如果您希望所有内容都匹配):
cumul = 1
i=1
while i < df.USER_ID.count() :
if df.USER_ID[i:(i+1)].all() == df.USER_ID[(i+1):(i+2)].all():
cumul == cumul
else :
cumul +=1
i +=1
虽然你也应该知道df.USER_ID[i:(i+1)]
和df.USER_ID[(i+1):(i+2)]
是恰好一个元素的系列,但python在[start,end]上运行,即[start,end-1]范围。这基本上意味着df.USER_ID[i:(i+1)]
是df.USER_ID[i]
。
同时也很惊讶你以后不会遇到其他问题,因为你的while循环应该i+1 < df.USER_ID.count()
当然没有处理最后一个元素。