如何基于类别计数排序为Pandas DataFrame创建标签列?
按类别计数排序生成标签字典并添加至Pandas DataFrame
问题描述
现有包含category列的Pandas DataFrame,数据如下:
import pandas as pd data = {'category': ['POLITICS','WELLNESS', 'ENTERTAINMENT', 'TRAVEL','POLITICS', 'ENTERTAINMENT','POLITICS'], 'dates': ["2013-01-31","2013-01-31","2013-02-02", "2013-02-02","2013-02-03", "2013-02-03", "2013-02-04"]} df1 = pd.DataFrame(data, columns=['category', 'dates'])
需要生成按类别计数从多到少分配0、1、2...序号的标签字典,用于为DataFrame添加label列。已通过df1["category"].value_counts().to_dict()得到计数字典:{'POLITICS': 3, 'ENTERTAINMENT': 2, 'WELLNESS': 1, 'TRAVEL': 1}
解决方案
步骤1:获取按计数降序排列的类别列表
value_counts()方法默认按计数降序返回结果,其index属性直接给出排序后的类别序列:
sorted_categories = df1['category'].value_counts().index
步骤2:生成标签字典
用enumerate遍历排序后的类别,将每个类别映射为从0开始的整数:
label_dict = {cat: idx for idx, cat in enumerate(sorted_categories)}
生成的字典为:{'POLITICS': 0, 'ENTERTAINMENT': 1, 'WELLNESS': 2, 'TRAVEL': 3}
步骤3:添加label列到DataFrame
使用map()方法完成标签映射,并用fillna()处理未知类别(示例中默认填充6,可按需调整):
df1['label'] = df1['category'].map(label_dict).fillna(6).astype(int)
完整代码示例
import pandas as pd # 创建DataFrame data = {'category': ['POLITICS','WELLNESS', 'ENTERTAINMENT', 'TRAVEL','POLITICS', 'ENTERTAINMENT','POLITICS'], 'dates': ["2013-01-31","2013-01-31","2013-02-02", "2013-02-02","2013-02-03", "2013-02-03", "2013-02-04"]} df1 = pd.DataFrame(data, columns=['category', 'dates']) # 生成按计数排序的标签字典 sorted_categories = df1['category'].value_counts().index label_dict = {cat: idx for idx, cat in enumerate(sorted_categories)} # 添加label列 df1['label'] = df1['category'].map(label_dict).fillna(6).astype(int) # 输出结果 print(df1)
运行后输出的正确结果:
category dates label 0 POLITICS 2013-01-31 0 1 WELLNESS 2013-01-31 2 2 ENTERTAINMENT 2013-02-02 1 3 TRAVEL 2013-02-02 3 4 POLITICS 2013-02-03 0 5 ENTERTAINMENT 2013-02-03 1 6 POLITICS 2013-02-04 0
内容的提问来源于stack exchange,提问作者Bluetail
相关产品推荐
相关产品推荐

