python - pandas:根据列值查找 df 中事件的首次发生并标记为新列值

标签 python pandas

我有一个如下所示的数据框:

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)

当“数据”列 = 1 时,Flag_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

关于python - pandas:根据列值查找 df 中事件的首次发生并标记为新列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35484876/

相关文章:

python - python中的加权移动平均线

Python:为什么不 (a, b, c) = (*x, 3)

python - 列 Pandas 数据帧的每一行中包含的列表中的总和值

python - 如何通过python for循环创建100个数据框名称

python - Python 多个父类上的 Super()__init__

python - 以特定方式迭代多维数组

Python Selenium 如何从跨度后的 div 中获取文本

python - 如何将 DataFrame 的列式和行式合并为一维数组?

python - 从 pandas 系列列表中获取唯一值

python - 如何将 JSON **文本** 写入 Excel 文件?