Пометка повторяющихся значений в столбце пандами - PullRequest
0 голосов
/ 09 января 2019

У меня есть 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 голосов
/ 09 января 2019

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
0 голосов
/ 09 января 2019

Давайте попробуем 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...