2016-02-18 16 views
4

我有一个数据帧,看起来像这样:大熊猫:求解基于列值以及标记为新列DF事件第一发生率值

customer_id event_date data 
1   2012-10-18 0  
1   2012-10-12 0  
1   2015-10-12 0  
2   2012-09-02 0  
2   2013-09-12 1  
3   2010-10-21 0  
3   2013-11-08 0  
3   2013-12-07 1  
3   2015-09-12 1  

我希望增加额外的列,如“flag_1” &'flag_2'下面,它允许我自己(和其他当我传递修改后的数据)过滤容易。

Flag_1表示该客户在数据集中首次出现。 dta.sort_values(['customer_id','event_date']) ,然后使用::我已通过排序成功地实施本dta.duplicated(['customer_id']).astype(int)

Flag_2将每个客户的第一入射的指示时,列“数据” = 1

什么样的一个例子实施额外的列看起来象下面这样:

customer_id event_date data flag_1 flag_2 
1   2012-10-18 0  1  0 
1   2012-10-12 0  0  0 
1   2015-10-12 0  0  0 
2   2012-09-02 0  1  0 
2   2013-09-12 1  0  1 
3   2010-10-21 0  1  0 
3   2013-11-08 0  0  0 
3   2013-12-07 1  0  1 
3   2015-09-12 1  0  0 

我是新来的熊猫和不确定如何在不遍历整个数据框贯彻“flag_2”列 - 我相信有实现使用内置函数b更快的方法ut没有发现任何帖子?

谢谢

回答

2

首先初始化空标志。使用groupby根据customer_id获取组。对于第一个标志,使用loc为每个组中的第一个值设置flag1的值。对于flag2使用相同的策略,但对于data已被设置为1的情况首先进行过滤。

# Initialize empty flags 
df['flag1'] = 0 
df['flag2'] = 0 

# Set flag1 
groups = df.groupby('customer_id').groups 
df.loc[[values[0] for values in groups.values()], 'flag1'] = 1 

# Set flag2 
groups2 = df.loc[df.data == 1, :].groupby('customer_id').groups 
df.loc[[values[0] for values in groups2.values()], 'flag2'] = 1 

>>> df 
    customer_id event_date data flag1 flag2 
0   1 2012-10-18  0  1  0 
1   1 2012-10-12  0  0  0 
2   1 2015-10-12  0  0  0 
3   2 2012-09-02  0  1  0 
4   2 2013-09-12  1  0  1 
5   3 2010-10-21  0  1  0 
6   3 2013-11-08  0  0  0 
7   3 2013-12-07  1  0  1 
8   3 2015-09-12  1  0  0 
+0

我试图实现您对我的数据集的解决方案,然而“标志1”值的数量并不似乎是正确的(在使用'df.customer_id.unique()。shape'检查)。 它似乎使用'[values [0]为groups.values()]中的值创建的列表是正确的长度,所以我认为它必须是与df.loc分配有关? 我也尝试过使用:'df.iloc [[values [0]为groups.values()],df.columns.get_loc('flag1')] = 1',这似乎并不正确'flag1'赋值中的值也是。 – user

+0

它出现'df.iloc [[values [0]为groups.values()]中的值,df.columns.get_loc('flag1')]'标识了赋值的正确df条目(使用'= 1'时) 。但是加上'= 1'后,不同的行选择的值为1.这是一个熊猫错误吗?我正在使用v。0.17.0 – user

+0

你能复制我的结果吗? – Alexander