Группировка и трансформация в пандах - PullRequest
0 голосов
/ 30 января 2019

Мои данные имеют следующую структуру:

       Name     Value       id
0    Alegro  0.850122   alegro
1    Alegro  0.447362   alegro
2    AlEgro  0.711295   alegro
3    ALEGRO  0.123761   alegro
4    alegRo  0.273111   alegro
5    ALEGRO  0.564893   alegro
6    ALEGRO  0.276369   alegro
7    ALEGRO  0.526434   alegro
8    ALEGRO  0.924014   alegro
9    ALEGrO  0.629207   alegro
10  Belagio  0.834231  belagio
11  BElagio  0.788357  belagio
12  Belagio  0.092156  belagio
13  BeLaGio  0.810275  belagio

Для репликации запустите следующий код:

data = {'Name': ['Alegro', 'Alegro', 'AlEgro', 'ALEGRO', 'alegRo', 'ALEGRO','ALEGRO',
                 'ALEGRO','ALEGRO','ALEGrO', 'Belagio','BElagio', 'Belagio', 'BeLaGio'],
     'Value': np.random.random(14)}

df = pd.DataFrame(data)

df['id'] = df.Name.str.lower()

Вы можете видеть, что есть некоторые опечатки в наборе данных.

df.groupby('id').Name.value_counts()

id       Name   
alegro   ALEGRO     5
         Alegro     2
         ALEGrO     1
         AlEgro     1
         alegRo     1
belagio  Belagio    2
         BElagio    1
         BeLaGio    1

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

Желаемый кадр данных должен быть:

       Name     Value       id
0    ALEGRO  0.850122   alegro
1    ALEGRO  0.447362   alegro
2    ALEGRO  0.711295   alegro
3    ALEGRO  0.123761   alegro
4    ALEGRO  0.273111   alegro
5    ALEGRO  0.564893   alegro
6    ALEGRO  0.276369   alegro
7    ALEGRO  0.526434   alegro
8    ALEGRO  0.924014   alegro
9    ALEGRO  0.629207   alegro
10  Belagio  0.834231  belagio
11  Belagio  0.788357  belagio
12  Belagio  0.092156  belagio
13  Belagio  0.810275  belagio

Любая идея будет высоко оценена!

1 Ответ

0 голосов
/ 30 января 2019

Используйте GroupBy.transform для возврата Series с тем же размером, что и оригинал DataFrame, поэтому можно создать новый столбец.

df['New'] = df.groupby('id').Name.transform(lambda x: x.value_counts().index[0])

Другое решение:

df['New'] = df.groupby('id').Name.transform(lambda x: x.mode().iat[0])

print (df)
       Name     Value       id      New
0    Alegro  0.850122   alegro   ALEGRO
1    Alegro  0.447362   alegro   ALEGRO
2    AlEgro  0.711295   alegro   ALEGRO
3    ALEGRO  0.123761   alegro   ALEGRO
4    alegRo  0.273111   alegro   ALEGRO
5    ALEGRO  0.564893   alegro   ALEGRO
6    ALEGRO  0.276369   alegro   ALEGRO
7    ALEGRO  0.526434   alegro   ALEGRO
8    ALEGRO  0.924014   alegro   ALEGRO
9    ALEGrO  0.629207   alegro   ALEGRO
10  Belagio  0.834231  belagio  Belagio
11  BElagio  0.788357  belagio  Belagio
12  Belagio  0.092156  belagio  Belagio
13  BeLaGio  0.810275  belagio  Belagio
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...