@H_404_1@我有一个如下所示的数据框:
@H_404_1@
dta.sort_values([ ‘CUSTOMER_ID’,‘EVENT_DATE’])
然后使用:dta.duplicated([‘customer_id’]).astype(int) @H_404_1@当列’数据’= 1时,Flag_2将指示每个客户的第一次发生. @H_404_1@实现的附加列的示例如下所示: @H_404_1@
@H_403_6@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@H_404_1@我希望添加其他列,例如’flag_1’和&下面的’flag_2′,允许我自己(以及其他我传递修改后的数据时)轻松过滤. @H_404_1@Flag_1表示该客户在数据集中的首次出现.我通过排序成功实现了这个:
dta.sort_values([ ‘CUSTOMER_ID’,‘EVENT_DATE’])
然后使用:dta.duplicated([‘customer_id’]).astype(int) @H_404_1@当列’数据’= 1时,Flag_2将指示每个客户的第一次发生. @H_404_1@实现的附加列的示例如下所示: @H_404_1@
@H_403_6@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@H_404_1@我是pandas的新手并不确定如何实现’flag_2’列而不迭代整个数据帧 – 我认为有一种更快的方法来实现使用内置函数但没有找到任何帖子? @H_404_1@谢谢
最佳答案
首先初始化空标志.使用groupby基于customer_id获取组.对于第一个标志,使用loc为每个组中的第一个值设置flag1的值.对flag2使用相同的策略,但首先过滤数据已设置为1的情况.
@H_404_1@
@H_403_6@# 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