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)
任何想法都将受到高度赞赏!
使用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)