我的数据具有以下结构:
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
任何想法将不胜感激!
答案 0 :(得分:5)
使用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