Как заменить повторяющееся значение в столбце, чтобы сделать его уникальным на основе другого столбца в Pandas? - PullRequest
3 голосов
/ 03 августа 2020

Я пытаюсь сделать столбец уникальным, если они дублируются и если дублируются значения другого столбца. В этом наборе данных.

    Name    Age
0   Tom 20
1   Tom 20
2   Jack    19
3   Terry   18
4   Terry   20

Я хочу, чтобы Том оставался таким же, как Терри, чтобы он был Терри_1 и Терри_2 и так далее, если у нас более 1 терри и если возраст не совпадает. Я пробовал код ниже.

import pandas as pd
import numpy as np
data = {'Name':['Tom', 'Tom', 'Jack', 'Terry','Terry'], 'Age':[20, 20, 19, 18,20]} 
df = pd.DataFrame(data)
df.Name=df.Name+df.groupby(['Name','Age']).cumcount().astype(str)

Я получаю:

Name    Age
0   Tom0    20
1   Tom1    20
2   Jack0   19
3   Terry0  18
4   Terry0  20

Я хочу:

Name    Age
0   Tom 20
1   Tom 20
2   Jack    19
3   Terry_1 18
4   Terry_2 20

Поскольку возраст Тома такой же, поэтому мы знаем У нас тот же Том, но Терри разный в зависимости от возраста.

Спасибо, Сэм

Ответы [ 2 ]

4 голосов
/ 03 августа 2020

Это можно сделать с помощью transform и factorize, тогда нам просто нужна маска nunique

s=df.groupby('Name').Age
df['New']=(df.Name+'_'+s.transform(lambda x : (x.factorize()[0]+1)).astype(str)).\
              mask(s.transform('nunique')==1,df.Name)
df
Out[230]: 
    Name  Age      New
0    Tom   20      Tom
1    Tom   20      Tom
2   Jack   19     Jack
3  Terry   18  Terry_1
4  Terry   20  Terry_2
0 голосов
/ 03 августа 2020

Можно, если в группе нет дубликатов и если размер группы > 1. Затем мы присваиваем значения с помощью loc и cumsum:

dups = ~df[['Name', 'Age']].duplicated(keep=False)
single = df.groupby('Name')['Age'].transform('size').ne(1)
grps = dups & single
df.loc[grps, 'Name'] = (
    df.loc[grps, 'Name'] + 
    '_' + 
    grps.groupby(df['Name']).cumsum().astype(int).astype(str)
)
      Name  Age
0      Tom   20
1      Tom   20
2     Jack   19
3  Terry_1   18
4  Terry_2   20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...