Python 使用熊猫标记列中的重复值
我有一个df,看起来像这样: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
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