Python 使用熊猫标记列中的重复值

Python 使用熊猫标记列中的重复值,python,pandas,dataframe,group-by,pandas-groupby,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 email is_new col_n a@a 0 z a@a 1 x b@b 0 y

我有一个df,看起来像这样:

email      is_new   col_n
a@a        1           z 
a@a        1           x      
b@b        1           y 
  email      is_new      col_n
    a@a        0           z 
    a@a        1           x      
    b@b        0           y 
我想更新电子邮件地址第一个实例的is_new列。新df应如下所示:

email      is_new   col_n
a@a        1           z 
a@a        1           x      
b@b        1           y 
  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
让我们试试groupby和cumcount:

或者

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

df2 = pd.concat([df] * 2, ignore_index=True).sort_values('email')
这只是一个代表性示例,但计数可以大于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
让我们试试groupby和cumcount:

或者

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

df2 = pd.concat([df] * 2, ignore_index=True).sort_values('email')
这只是一个代表性示例,但计数可以大于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
IIUC,使用:

IIUC,使用:


“is_late”列在哪里?实际上应该是什么列名?你是新来的吗?你迟到了吗?is_min?@coldspeed its is_new,我对我进行了编辑,似乎您想要的is_new列将更合适地命名为is_not_new,因为您将重复的值标记为1 is_late列在哪里?实际上应该是什么列名?你是新来的吗?你迟到了吗?is_min?@coldspeed its_是新的,我对我做了编辑,看来你想要的is_新专栏会更恰当地命名为is_not_new,因为您将重复的值标记为1@DanielMesejo我假设任何大于0的值都应该变为1。@coldspeed:如果你能解释cumcount和ne是如何工作的,那真的很有帮助吗?@RahulAgarwal完成了。@coldspeed:在cumcount之后,ne0检查哪个值不等于零,并给它分配一个整数值。。对吗?@coldspeed how我是否可以使您的代码灵活,以便无论是0还是1,代码都会用相反的值替换第一个值?因此,如果它的0值被1替换,反之亦然。@DanielMesejo我假设任何大于0的值都应该变为1。@coldspeed:如果你能解释cumcount和ne是如何工作的,那真的很有帮助吗?@RahulAgarwal Done.@coldspeed:在cumcount之后,ne0检查哪个值是检查哪个元素不等于零,并给它赋值it..right?@coldspeed如何使您的代码灵活,以便无论是0还是1,代码都会用相反的值替换第一个值?所以如果它的0值被1替换,反之亦然。谢谢你的回复。如何使您的代码灵活,以便无论是0还是1,代码都会用相反的值替换第一个值?所以如果它的0值被1替换,反之亦然。谢谢你的回复。如何使您的代码灵活,以便无论是0还是1,代码都会用相反的值替换第一个值?所以如果它的0值被1替换,反之亦然。
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