我有一个数据框,看起来像这样:
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”,这样我自己(以及传递修改后的数据时的其他人)可以方便地进行筛选。
标志1表示该客户在数据集中的第一次出现。我通过排序成功地实现了这一点:
dta.sort_values(['customer_id','event_date'])
然后使用:
dta.duplicated(['customer_id']).astype(int)
当“数据”列=1时,标志2将指示每个客户的第一个关联。
下面是实现的附加列的示例:
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
我对pandas还不太熟悉,不确定如何在不遍历整个数据帧的情况下实现“flag_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