首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python,Pandas如何根据观察次数分配分组编号?

Python,Pandas如何根据观察次数分配分组编号?
EN

Stack Overflow用户
提问于 2022-08-25 10:51:49
回答 1查看 33关注 0票数 3

我想为每个产品分配一个唯一的ID,它是子类别。输入数据如下所示:

代码语言:javascript
复制
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,所以我想出了这样的解决方案:

代码语言:javascript
复制
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)

其结果是:

代码语言:javascript
复制
    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

不过,我想取得更多的成果是:

从1开始的

  • ID号,而不是0
  • 组,大多数观测值都分配了较低的编号(当前为
  • )

因此,最终的输出应该如下所示:

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-25 10:58:23

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

代码语言:javascript
复制
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))
)

产出:

代码语言:javascript
复制
  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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73486234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档