python 、 Pandas 。如何根据观察数分配分组数?

标签 python pandas dataframe

我想为每个产品及其子类别分配一个唯一的 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

最佳答案

您可以使用pandas.factorize关于 value_counts 的输出(默认按频率降序排序):

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 、 Pandas 。如何根据观察数分配分组数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73486234/

相关文章:

python - 查看函数是否被调用

pandas - Pandas DataFrame 创建时出现问题

python - 如何在 Pandas 数据框中保留前两个副本?

python - 如何拆分/ reshape 一个 numpy 数组

python - 用变量替换表名。使用 python 和 mysql 连接器

python - Pandas - 从派生计算中替换行值

R最快速的方式条件选择

r - 查找值等于您的值的子集

Python sklearn OneVsRestClassifier : Score function gives ValueError

python - Pandas 数据框获取每组的第一行