我有一个如下所示的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
答案 0 :(得分:4)
让我们尝试groupby
和cumcount
:
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