我想 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将通知ManufacturerProduct,所以我想出了这样的解决方案:

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

推荐答案

您可以对value_counts的输出使用pandas.factorize(默认情况下按频率降序排序):

id1, val1 = pd.factorize(df['Manufacturer'].value_counts().index)
id2, val2 = pd.factorize(df['Product'].value_counts().index)

df['UNIQUE_ID'] = (
    df['Manufacturer'].map(pd.Series(id1+1, index=val1).astype(str))
    +'.'+
    df['Product'].map(pd.Series(id2+1, index=val2).astype(str))
)

输出:

  Manufacturer   Product UNIQUE_ID
0      Samsung     Phone       2.1
1      Samsung     Phone       2.1
2      Siemens  Computer       1.3
3      Siemens    Sensor       1.2
4      Siemens    Sensor       1.2
5        Apple     Phone       3.1
6        Apple   MacBook       3.4

Python相关问答推荐

为什么Pydantic在我申报邮箱时说邮箱丢失

如何确保Flask应用程序管理面板中的项目具有单击删除功能?

如何从维基百科的摘要部分/链接列表中抓取链接?

如何使用函数正确索引收件箱?

Flask:如何在完整路由代码执行之前返回验证

在后台运行的Python函数

如何用symy更新分段函数

仅从风格中获取 colored颜色 循环

使用plotnine和Python构建地块

在Python中处理大量CSV文件中的数据

在Python Attrs包中,如何在field_Transformer函数中添加字段?

如何制作10,000年及以后的日期时间对象?

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

无法使用DBFS File API路径附加到CSV In Datricks(OSError Errno 95操作不支持)

对象的`__call__`方法的setattr在Python中不起作用'

迭代嵌套字典的值

如何在Python中使用另一个数据框更改列值(列表)

如何更改groupby作用域以找到满足掩码条件的第一个值?

如何防止Pandas将索引标为周期?