在熊猫中分组和转换

And*_*d_R 5 python group-by pandas

我的数据具有以下结构:

       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
Run Code Online (Sandbox Code Playgroud)

复制运行以下代码:

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()
Run Code Online (Sandbox Code Playgroud)

你可以看到有一些拼写错误的数据集.

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
Run Code Online (Sandbox Code Playgroud)

因此,目标是从每个类别中获取最常用的值并将其设置为新名称.对于第一组,它将是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
Run Code Online (Sandbox Code Playgroud)

任何想法都将受到高度赞赏!

jez*_*ael 5

使用GroupBy.transform退货Series与像原来一样大小DataFrame,所以可以创建新列.

df['New'] = df.groupby('id').Name.transform(lambda x: x.value_counts().index[0])
Run Code Online (Sandbox Code Playgroud)

另一种方案:

df['New'] = df.groupby('id').Name.transform(lambda x: x.mode().iat[0])
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)