用熊猫标记列中的重复值

时间:2019-01-09 19:20:48

标签: python pandas dataframe group-by pandas-groupby

我有一个如下所示的df:

email      is_new   col_n
a@a        1           z 
a@a        1           x      
b@b        1           y 

我想更新电子邮件地址的第一个实例的is_new列。新的df应该看起来像这样:

  email      is_new      col_n
    a@a        0           z 
    a@a        1           x      
    b@b        0           y 

我尝试创建IF语句来检查电子邮件地址的数量,但不起作用:

   1.  if df[df["email"].groupby().unique()> 1] ==True:
        print('ook')

   2. df.loc[df.groupby('email').groupby().unique(), 'is_new']=1

2 个答案:

答案 0 :(得分:4)

让我们尝试groupbycumcount

df['is_new'] = df.groupby('email').cumcount().astype(bool).astype(int)

或者,

df['is_new'] = df.groupby('email').cumcount().ne(0).astype(int)

df
  email  is_new col_n
0   a@a       0     z
1   a@a       1     x
2   b@b       0     y

详细信息
cumcount返回一行中每个项目的递增计数:

df2 = pd.concat([df] * 2, ignore_index=True).sort_values('email')

df2.groupby('email').cumcount()

0    0
1    1
3    2
4    3
2    0
5    1
dtype: int64

这只是一个代表性的示例,但是计数可以大于1。我可以使用以上两种选择之一将所有计数> 0转换为1:

df2.groupby('email').cumcount().ne(0).astype(int)
# df2.groupby('email').cumcount().astype(bool).astype(int)

0    0
1    1
3    1
4    1
2    0
5    1
dtype: int64

答案 1 :(得分:2)

IIUC,使用duplicated

df['is_new'] = df.email.duplicated().astype(int)
#              df.duplicated(subset=['email']).astype(int)
#              
#              ^ second is better if you want to check more than a single column

  email  is_new col_n
0   a@a       0     z
1   a@a       1     x
2   b@b       0     y