在i和i + 1行上设置条件时,要创建一个新的标志列?

时间:2019-04-29 16:22:31

标签: python pandas

当i的行具有“ subcategory_click”且i + 1的“ add_basket_click”时,创建一个新列,其值为1。所以输入就像:

event_name
Basket_Viewed
remove_basket_click
subcategory_click
add_basket_click
subcategory_click
add_basket_click
add_basket_click
add_basket_click
subcategory_click
subcategory_click
subcategory_click
subcategory_click
add_basket_click
add_basket_click

输出将是:

event_name           Flag
Basket_Viewed   
remove_basket_click 
subcategory_click      1
add_basket_click    
subcategory_click      1
add_basket_click    
add_basket_click    
add_basket_click    
subcategory_click   
subcategory_click   
subcategory_click   
subcategory_click      1
add_basket_click    
add_basket_click    

正在寻找pythonic解决方案,因为真正的数据集非常庞大。

2 个答案:

答案 0 :(得分:4)

使用shift

df['Flag']=(df['event_name'].eq('subcategory_click') & df['event_name'].shift(-1).eq('add_basket_click')).astype(int)

答案 1 :(得分:3)

map

  • 使用词典,其中唯一的键是我们要查找的组合的元组。但是,不能只映射该字典,因为我想使用空字符串''的默认值,所以我想利用dict.get方法使我能够返回默认值。我将其包裹在方便的lambda中,我几乎可以使用了。
  • 我使用map,并且可以传递多个序列(对于被映射的可调用对象的每个参数,一个序列)
  • 我在*上下文中使用[]map返回值解压缩到列表中

tup = ('subcategory_click', 'add_basket_click')
def fn(x, y): return {tup: 1}.get((x,  y), '')

df.assign(Flag=[*map(fn, df.event_name, df.event_name.shift(-1))])

             event_name Flag
0         Basket_Viewed     
1   remove_basket_click     
2     subcategory_click    1
3      add_basket_click     
4     subcategory_click    1
5      add_basket_click     
6      add_basket_click     
7      add_basket_click     
8     subcategory_click     
9     subcategory_click     
10    subcategory_click     
11    subcategory_click    1
12     add_basket_click     
13     add_basket_click