Как рассчитать значение столбца на основе иерархии - PullRequest
0 голосов
/ 24 февраля 2019

Допустим, мы согласны со следующим порядком в терминах иерархии.

Ребенок -> Ребенок -> Подросток -> Взрослый

У меня есть этот набор данных

           Name         Stage  Highest_Stage_Reached
0          Adam         Child  
1         Barry         Child
2           Ben         Adult
3          Adam      Teenager
4         Barry         Adult
5           Ben         Baby

Как мне получить набор данных для заполнения поля Highest_Stage_Reached следующим образом?

           Name         Stage  Highest_Stage_Reached
0          Adam         Child  Teenager
1         Barry         Child  Adult
2           Ben         Adult  Adult
3          Adam      Teenager  Teenager
4         Barry         Adult  Adult
5           Ben         Baby   Adult

Ответы [ 3 ]

0 голосов
/ 24 февраля 2019

Поместите вашу иерархию в список, используя индекс списка.

l = ['Baby', 'Child', 'Teenager', 'Adult']
df = pd.DataFrame({'Name': ['Adam', 'Barry', 'Ben', 'Adam', 'Barry', 'Ben'], 'Stage': ['Child', 'Child', 'Adult', 'Teenager', 'Adult', 'Baby']})

cond = [df['Stage'] == 'Baby',df['Stage'] == 'Child',df['Stage'] == 'Teenager',df['Stage'] == 'Adult']
df['Highest_Stage_Reached'] = np.select(cond, [0,1,2,3])

    Name     Stage  Highest_Stage_Reached
0   Adam     Child                      1
1  Barry     Child                      1
2    Ben     Adult                      3
3   Adam  Teenager                      2
4  Barry     Adult                      3
5    Ben      Baby                      0

df['Highest_Stage_Reached'] = (df.groupby('Name')['Highest_Stage_Reached'].transform(max))

    Name     Stage  Highest_Stage_Reached
0   Adam     Child                      2
1  Barry     Child                      3
2    Ben     Adult                      3
3   Adam  Teenager                      2
4  Barry     Adult                      3
5    Ben      Baby                      3


df['Highest_Stage_Reached'] = df['Highest_Stage_Reached'].apply(lambda x: l[x])
print(df)

output:

    Name     Stage Highest_Stage_Reached
0   Adam     Child              Teenager
1  Barry     Child                 Adult
2    Ben     Adult                 Adult
3   Adam  Teenager              Teenager
4  Barry     Adult                 Adult
5    Ben      Baby                 Adult
0 голосов
/ 24 февраля 2019

Преобразовать столбец в категориальный, с параметром заказа.Теперь это позволяет вам сортировать.Это также будет поддерживать переменное количество аргументов в рабочей области.

df['Stage'] = pd.Categorical(df['Stage'], ordered=True, categories=['Baby', 'Child','Teenager','Adult'])

df['Highest_Stage_Reached'] = df.groupby('Name').Stage.transform('max')

    Name    Stage       Highest_Stage_Reached
0   Adam    Child       Teenager
1   Barry   Child       Adult
2   Ben     Adult       Adult
3   Adam    Teenager    Teenager
4   Barry   Adult       Adult
5   Ben     Baby        Adult
0 голосов
/ 24 февраля 2019

Вы можете использовать:

d={'Baby':0,'Child':1,'Teenager':2,'Adult':3}
df['rank']=df.Stage.map(d)
df['Highest_Stage_Reached']=df.groupby('Name')['rank'].transform('max').\
                                         map({v: k for k, v in d.items()})
print(df.drop('rank',1))

    Name     Stage Highest_Stage_Reached
0   Adam     Child              Teenager
1  Barry     Child                 Adult
2    Ben     Adult                 Adult
3   Adam  Teenager              Teenager
4  Barry     Adult                 Adult
5    Ben      Baby                 Adult
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...