我想 for each 产品及其子类别分配一个唯一的ID.输入数据如下所示:
d = {'Manufacturer': ['Samsung','Samsung','Siemens','Siemens','Siemens','Apple','Apple'],
'Product': ['Phone','Phone','Computer','Sensor','Sensor','Phone','MacBook']}
df = pd.DataFrame(data=d)
Manufacturer Product
0 Samsung Phone
1 Samsung Phone
2 Siemens Computer
3 Siemens Sensor
4 Siemens Sensor
5 Apple Phone
6 Apple MacBook
我希望UNIQUE_ID
将通知Manufacturer
和Product
,所以我想出了这样的解决方案:
df['ID_Manufacturer'] = df.groupby(['Manufacturer']).ngroup()
df['ID_Product'] = df.groupby(['Product']).ngroup()
columns = ['ID_Manufacturer', 'ID_Product']
df[columns] = df[columns].astype(str)
df['UNIQUE_ID'] = df[columns].apply(lambda x: '.'.join(x[x.notnull()]), axis = 1)
df.drop(['ID_Manufacturer', 'ID_Product'], axis = 1)
结果是:
Manufacturer Product UNIQUE_ID
0 Samsung Phone 1.2
1 Samsung Phone 1.2
2 Siemens Computer 2.0
3 Siemens Sensor 2.3
4 Siemens Sensor 2.3
5 Apple Phone 0.2
6 Apple MacBook 0.1
然而,我更想实现的是:
- ID号从1开始,而不是0
- 观察值最多的组分配的编号较低(当前按字母顺序排列)
因此,最终输出应如下所示:
Manufacturer Product UNIQUE_ID
0 Samsung Phone 3.1
1 Samsung Phone 3.1
2 Siemens Computer 1.2
3 Siemens Sensor 1.3
4 Siemens Sensor 1.3
5 Apple Phone 2.4
6 Apple MacBook 2.3